使用subprocess执行airflow list_dags返回非零退出状态120求助
使用subprocess调用
airflow list_dags返回非零退出状态120,但直接命令行可正常执行 我编写了一段Python代码,计划通过subprocess模块运行airflow list_dags命令,代码如下:
dags_raw = subprocess.check_output( 'airflow list_dags', shell=True ).split()
但运行时出现以下错误:
File "/usr/lib/python3.7/subprocess.py", line 411, in check_output **kwargs).stdout File "/usr/lib/python3.7/subprocess.py", line 512, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command 'airflow list_dags' returned non-zero exit status 120.
我可以直接在服务器上正常运行airflow list_dags命令,环境信息如下:
Apache Airflow [1.10.12] Platform: [Linux, x86_64] Python Version: [3.7.3]
可能的原因及解决方法
1. 环境变量不一致
subprocess调用的是非交互式shell,不会加载用户shell配置(如.bashrc/.zshrc)里的环境变量,导致PATH、AIRFLOW_HOME等关键变量和手动执行命令时不一致。
解决方法:
- 用
which airflow在命令行获取airflow的完整路径,替换代码中的命令:dags_raw = subprocess.check_output( '/usr/local/bin/airflow list_dags', shell=True ).split() - 或者手动传递完整环境变量:
import os env = os.environ.copy() # 补充必要的环境变量,比如AIRFLOW_HOME和包含airflow的PATH env['AIRFLOW_HOME'] = '/your/airflow/home/path' env['PATH'] = '/path/to/airflow/bin:' + env['PATH'] dags_raw = subprocess.check_output( 'airflow list_dags', shell=True, env=env ).split()
2. 捕获stderr查看详细错误
check_output默认只捕获stdout,无法看到命令执行时的错误输出,导致无法定位具体问题。可以修改代码捕获stderr:
import subprocess try: dags_raw = subprocess.check_output( 'airflow list_dags', shell=True, stderr=subprocess.STDOUT ).split() except subprocess.CalledProcessError as e: print("命令错误输出:", e.output.decode()) raise
通过打印的错误输出,能直接看到Airflow返回120状态码的具体原因(比如配置文件找不到、数据库连接失败等)。
3. 用户权限差异
如果代码运行的用户和手动执行命令的用户不同(比如代码由服务用户运行,而你用普通用户执行命令),可能存在权限问题,导致无法访问Airflow配置或元数据。
解决方法:
- 确保运行代码的用户和手动执行的用户一致;
- 给运行代码的用户授予Airflow配置目录、元数据库的访问权限。
4. 显式指定Airflow配置文件
非交互式shell可能无法自动找到Airflow配置文件,可在命令中显式指定:
dags_raw = subprocess.check_output( 'AIRFLOW_CONFIG=/path/to/your/airflow.cfg airflow list_dags', shell=True ).split()
内容的提问来源于stack exchange,提问作者suganthan sivananthan
相关产品推荐
相关产品推荐

