如何在subprocess.run中为参数cwd创建路径



我有以下路径:

airflow_home = os.path.join("opt", "airflow")
airflow_docs = os.path.join(airflow_home, "docs")

我希望在bash命令中使用airflow_docs路径。为此,我使用了以下代码:

subprocess.run([f"sphinx-apidoc -o ./ ../plugins"],
shell=True,
cwd=airflow_docs)

我得到一个错误FileNotFoundError

然而,这确实有效:

subprocess.run([f"sphinx-apidoc -o ./ ../{doc_module}"],
shell=True,
cwd="/opt/airflow/docs")

因此,似乎是缺少前导斜杠造成了问题。我在谷歌上搜索过在一条没有成功的路径上添加前导斜杠的内容。那么,subprocess.run是否可以使用os.path包,或者我是否必须使用硬编码字符串?

如果你想要一个斜线,就放一个斜线。

airflow_home = os.path.join("/opt", "airflow")

当然,让Python将字符串粘合在一起并不是很有用。事实上,os.path.join的结果只是一个字符串,相当于一个硬编码的字符串。所以写出来吧:

airflow_home = "/opt/airflow"

或者,如果你想在Python中做到这一点,也许更喜欢pathlib:

airflow_home = pathlib.Path("/opt") / "airflow"

顺便说一句,您的subprocess代码已损坏;您想要传递一个带shell=True的字符串,或者传递一个不带shell=True的令牌列表。(Windows"有用地"隐藏了这个错误,但它仍然是错误的。(

subprocess.run(
["sphinx-apidoc", "-o", "./", "../plugins"],
cwd=airflow_docs)

subprocess方便地允许您将pathlib.Path对象作为cwd的值传入,尽管如果您需要支持旧版本的Python,情况可能并不总是如此。

如果子进程失败,您可能希望添加check=True以使Python引发错误。请参阅Python 中的运行Bash命令

最新更新