我正在尝试编写一个python脚本,它将一个字符串发送到程序并将其置于后台。在命令行上,我可以复制并粘贴以下代码,并让它成功地执行我希望python程序执行的操作:
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
是路径中可执行程序的别名。在
我尝试过的几种方法(一次一个):
^{pr2}$所有的都失败了(p7除外)。有些失败并出现“Fortran运行时错误:文件结束”(来自vpfit程序)。其他的则会失败,并返回到子进程库和“OSError:[Errno 2]没有这样的文件或目录”。在
一些检查:当我打印cmd2
并将其复制并粘贴到终端时,它工作得非常好。当我运行p7
时,它按预期正确地开始运行程序,只是没有给它输入字符串。很明显我遗漏了一些基本的东西,我就是不知道是什么。感谢任何帮助!在
是的,你遗漏了一些基本的东西——管道是由外壳处理的。若要对子进程执行所需的操作,应将
vpfit95
作为子进程运行,然后使用communicate
。参见文件第17.1.4.2节,replacing a shell pipeline。在如果需要检查vpfit的stdout和stderr,那么从
communicate
的输出元组获取句柄。在一个肮脏的替代方法是使用
shell=True
运行命令,这会在shell中生成它,然后可以在命令中使用管道,但是“去掉中间人”并直接与子进程交互会更干净。在相关问题 更多 >
编程相关推荐