【问题标题】:Running bash commands from python script in certain directory在特定目录中从 python 脚本运行 bash 命令
【发布时间】:2015-10-31 17:46:48
【问题描述】:

我正在尝试编写一个 Python 脚本以在多个目录中从 bash 递归运行程序,并将输出保存(现在只是显示)日志文件中。

问题是,当我尝试从主目录运行该应用程序时,只需提供输入文件的完整路径,它就会崩溃,所以我通常直接在包含输入文件的目录中运行它。我曾尝试使用 os.popen() 和 pexpect 来做到这一点,但我认为这里最合适的是子进程。

我的代码:

import subprocess,
from subprocess import Popen, PIPE 

subprocess.Popen("$fp "+pcr+" "+dat, cwd=path+dirs[0], stdout=PIPE)
print output.stdout.read()

其中 pcr 和 dat 是输入文件的名称。

当我尝试运行它时,我收到以下错误:

Traceback (most recent call last):
File "file_ed.py", line 47, in <module>
subprocess.Popen("$fp "+pcr+" "+dat, cwd=retval, stdout=PIPE)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
 File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

此问题的原因可能是什么以及如何解决?

【问题讨论】:

  • 您正在尝试访问文件或运行不存在的命令。例如,可能没有命令$fp。有关在子进程中使用环境变量的信息,请参阅 this question
  • 运行一系列 bash 命令的最佳方法是编写一个 bash 脚本来执行它。你的方法很难做到。

标签: python bash subprocess


【解决方案1】:

我认为您的问题是您想将 pcrdat 作为参数传递给程序,并且您认为空格会为您做到这一点——但 Python 不是 bash。只需使用一个数组,它应该可以工作:

subprocess.Popen([fp, pcr, dat], cwd=path+dirs[0], stdout=PIPE)

你得到“没有这样的文件或目录”的原因:Python 正在寻找一个名为 "$fp "+pcr+" "+dat 的程序,即它假定空格(和美元符号,除非你的意思是它是一种伪代码占位符) 是程序名称的一部分。错误告诉你没有这样名字的程序。

但是很难猜出您的意思,因为您的 sn-p 不完整。我真的不知道$fppcrdat 是什么意思。

还可以查看子流程模块文档中的示例。

【讨论】:

  • 对这个模棱两可的$fp datpcr 感到抱歉。最后两个是我所说的包含我要运行的应用程序的输入文件的字符串。 $fp 是 bash 中应用程序的符号链接,但我认为它不会那样工作,所以我将其更改为完整路径。我已经使用 pexpect 解决了它:child = pexpect.run('/usr/local/bin/FullProf_Suite/fp2k '+pcr+' '+dat,logfile=sys.stdout,cwd=path+dirs[0])
  • 'path' 和 'dirs[0]' 只是构成我工作目录路径的字符串。谢谢回复!
猜你喜欢
  • 1970-01-01
  • 2020-08-12
  • 2012-11-13
  • 2022-08-15
  • 1970-01-01
  • 2018-08-19
  • 2011-06-11
  • 2017-12-07
  • 2014-10-04
相关资源
最近更新 更多