You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:41:27