【问题标题】:Python run subprocess from parent directoryPython从父目录运行子进程
【发布时间】:2017-07-10 09:57:23
【问题描述】:

嘿,我有以下目录结构:

带有a.sh 的父目录和带有b.py 的子目录py。 现在我想从b.py 打电话给a.sh。我该怎么做?

我的尝试包括:

subprocess.run(['./a.sh'], cwd="..", stdout=subprocess.PIPE)

import os
initPath = os.path.pardir   
subprocess.run([initPath+'./a.sh'], stdout=subprocess.PIPE)

在这两种情况下我都得到:

FileNotFoundError: [Errno 2] No such file or directory: './a.sh'

【问题讨论】:

  • 尝试使用文件的绝对路径。即从根
  • @AkshayApte 我忘了这不是一个选项,因为绝对路径会根据使用的计算机而变化。改变所有这些变量太麻烦了……

标签: python subprocess


【解决方案1】:

我建议使用从你的 python 脚本路径计算的绝对路径。

import os

source = os.path.dirname(__file__)
parent = os.path.join(source, '../')
script_path = os.path.join(parent, 'a.sh')

script_path 将是您的脚本的绝对路径,并且将根据您的 python 脚本的路径计算,因此如果您的 bash 脚本始终位于与您的 python 脚本相同的相对路径,无论您在哪个目录,它都将始终有效运行程序。


顺便说一句,我建议始终使用os.path.join 来计算路径,从不将字符串与+ 连接,但使用format。我让你检查一下原因。

【讨论】:

    【解决方案2】:

    Python 为这样的事情添加了pathlib

    f_path = Path(__file__)
    s_path = os.path.join(path.parent.parent, 'a.sh')
    subprocess.run(s_path)
    

    假设你的路径看起来像这样,repo 在你的根目录中。

    repo
    ├── a.py
    └── py
        └── b.py
    

    f_path 是您正在运行的文件b.py 的绝对路径,即:repo/py/b.py。以它的父代为repo/py,以它的父代为repo。然后我们将a.sh 附加到该路径,我们得到repo/a.sh。您现在可以将此路径输入到您的子进程命令中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2021-04-19
      • 2015-07-23
      相关资源
      最近更新 更多