Python子进程Popen将字符串发送到程序

2024-10-04 07:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个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时,它按预期正确地开始运行程序,只是没有给它输入字符串。很明显我遗漏了一些基本的东西,我就是不知道是什么。感谢任何帮助!在


Tags: 文件字符串代码命令行程序脚本粘贴nn
1条回答
网友
1楼 · 发布于 2024-10-04 07:24:38

是的,你遗漏了一些基本的东西——管道是由外壳处理的。若要对子进程执行所需的操作,应将vpfit95作为子进程运行,然后使用communicate。参见文件第17.1.4.2节,replacing a shell pipeline。在

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

如果需要检查vpfit的stdout和stderr,那么从communicate的输出元组获取句柄。在

一个肮脏的替代方法是使用shell=True运行命令,这会在shell中生成它,然后可以在命令中使用管道,但是“去掉中间人”并直接与子进程交互会更干净。在

相关问题 更多 >