我正在尝试编写一个将字符串发送到程序并将其放入后台的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
时,它正确地开始按预期运行程序,只是没有输入字符串。我显然在这里失去了一些根本性的东西,我无法弄清楚什么。任何帮助感谢!
好吧,我实际上已经尝试过(在你的建议之前和之后)。这里发生了什么:vpfit启动并等待输入 - 它从来没有看到传递给它的字符串。如果我补充说vpfit是一个古怪的老fortran程序,它有帮助吗? – JBWhitmore 2012-07-17 07:25:04
这不应该是一个胡思乱想的老fortran程序。你使用'stdin'手柄吗?这是一个关键字arg到Popen,我将它添加到我的答案中。 – wim 2012-07-17 07:26:37
它工作。一开始没有看到你的编辑。谢谢! – JBWhitmore 2012-07-17 07:30:43