如何解决subprocess.run使用os.path生成的cwd路径报错问题
问题排查与修复方案
你遇到的报错和subprocess.run是否接受os.path生成的路径无关,核心问题出在路径定义阶段:
你使用os.path.join("opt", "airflow")生成路径时,第一个片段opt没有前导斜杠,生成的是相对于当前Python脚本运行目录的相对路径opt/airflow,而非你预期的根目录下的绝对路径/opt/airflow,所以cwd参数指向的地址不存在,触发FileNotFoundError。
os.path生成的路径本身是合法的字符串,完全可以直接传入subprocess.run的所有参数位,不需要硬编码。
修复方案
- 方案1:定义路径时直接使用带前导斜杠的根路径片段
# 第一个参数改为带根目录标识的"/opt" airflow_home = os.path.join("/opt", "airflow") airflow_docs = os.path.join(airflow_home, "docs")
- 方案2:若已生成相对路径,可手动补全为根目录下的绝对路径
airflow_docs = os.path.join("/", airflow_docs)
- 优化建议:你当前的写法混用了
shell=True和列表传参,不符合最佳实践。如果开启shell=True建议直接传命令字符串,若传列表参数建议关闭shell=True,可以规避额外的shell解析问题,同时提升安全性:
# 关闭shell=True的写法,更安全 subprocess.run(["sphinx-apidoc", "-o", "./", "../plugins"], cwd=airflow_docs)
内容的提问来源于stack exchange,提问作者Javier Lopez Tomas
相关产品推荐
相关产品推荐

