2015-08-08 153 views
1

我正在尝试编写一个Python脚本来从多个目录中的bash中递归运行一个程序,并在日志文件中保存(现在只是显示)输出。从特定目录中的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 

可能是什么这个问题的原因,以及如何解决它?

+1

您正在尝试访问文件或运行不存在的命令。例如,可能没有命令'$ fp'。有关在子进程中使用环境变量的信息,请参见[此问题](http://stackoverflow.com/questions/26643719/python-exporting-environment-variables-in-subprocess-popen)。 –

+0

运行一系列bash命令的最好方法是编写一个bash脚本来完成它。你的方法是艰难的。 – msw

回答

2

我认为你的问题是,你想通过pcrdat作为程序的参数,你认为空白会为你做 - 但Python不是bash。只需使用一个数组,它应该工作:

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

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

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

另请参阅子流程模块文档中的示例。

+0

对不起''fp dat'和'pcr'这个模棱两可的问题。最后两个是我说的字符串包含我想要运行的应用程序的输入文件。 '$ fp'是bash中应用程序的符号链接,但我不认为它会以这种方式工作,所以我将其更改为完整路径。我用pexpect解决了它:'child = pexpect.run('/ usr/local/bin/FullProf_Suite/fp2k'+ pcr +''+ dat,logfile = sys.stdout,cwd = path + dirs [0]) – Silneus

+0

'path'和'dirs [0]'只是形成我的工作目录的路径的字符串。感谢您的回复! – Silneus