我有以下路径:
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命令