【问题标题】:How to create a path for the argument cwd in subprocess.run如何在 subprocess.run 中为参数 cwd 创建路径
【发布时间】:2022-01-12 13:28:20
【问题描述】:

我有以下路径:

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 包,还是必须使用硬编码字符串?

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

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

    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 引发错误。或许也可以看看Running Bash commands in Python

    【讨论】:

      猜你喜欢
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多