2012-07-17 51 views
1

我正在尝试编写一个将字符串发送到程序并将其放入后台的Python脚本。在命令行中,我可以复制和粘贴下面的代码,并将它成功地做我想做的Python程序做:Python子流程Popen将一个字符串管道传递给程序

printf "f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n" | vpfit95 

其中:vpfit95是一个别名,以我的路径中的可执行程序。

什么,我已经尝试了一些排列(试过一次一个):

import subprocess 
vpfitExecutable = 'vpfit95' 

String1=r'f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n' 
String2=r"f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n" 
String3="f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n" 

cmd1 = "printf \"" + String1 + "\"" 
cmd2 = "printf \"" + String1 + "\" | " + vpfitExecutable 
cmd3 = "printf \"" + String2 + "\"" 
cmd4 = "printf \"" + String3 + "\"" 

print cmd2 

p1 = subprocess.Popen([vpfitExecutable, cmd1]) 
p2 = subprocess.Popen([cmd2]) 
p3 = subprocess.Popen([vpfitExecutable, cmd3]) 
p4 = subprocess.Popen([vpfitExecutable, cmd4]) 
p4 = subprocess.Popen([vpfitExecutable, String1]) 
p5 = subprocess.Popen([vpfitExecutable, String2]) 
p6 = subprocess.Popen([vpfitExecutable, String3]) 

# check 
p7 = subprocess.Popen([vpfitExecutable]) # works. 

而且全部失败(除P7)。某些失败,出现“Fortran运行时错误:文件结束”(来自vpfit程序)。其他操作失败,回溯到子进程库和“OSError:[Errno 2]没有这样的文件或目录”。

一些检查:当我打印cmd2并将其复制并粘贴到终端时,它可以正常工作。当我运行p7时,它正确地开始按预期运行程序,只是没有输入字符串。我显然在这里失去了一些根本性的东西,我无法弄清楚什么。任何帮助感谢!

回答

5

是的,你错过了一些基本的东西 - 管道由shell处理。要做你想要的子进程,你应该运行vpfit95作为子进程,然后communicate与它一起运行。请参阅文档的第17.1.4.2节,replacing a shell pipeline

proc = subprocess.Popen([vpfitExecutable], stdin=subprocess.PIPE) 
proc.communicate(input='your string') 

如果您需要检查vpfit的输出和错误,然后从communicate输出元组抓住把手。

肮脏的替代方法是使用shell=True运行你的命令,该命令在shell中产生,然后你可以在你的命令中使用管道,但是“切断中间人”并直接与子进程交互更清洁。

+0

好吧,我实际上已经尝试过(在你的建议之前和之后)。这里发生了什么:vpfit启动并等待输入 - 它从来没有看到传递给它的字符串。如果我补充说vpfit是一个古怪的老fortran程序,它有帮助吗? – JBWhitmore 2012-07-17 07:25:04

+0

这不应该是一个胡思乱想的老fortran程序。你使用'stdin'手柄吗?这是一个关键字arg到Popen,我将它添加到我的答案中。 – wim 2012-07-17 07:26:37

+0

它工作。一开始没有看到你的编辑。谢谢! – JBWhitmore 2012-07-17 07:30:43

相关问题