gpt4 book ai didi

Python 子进程 Popen 将字符串传递给程序

转载 作者:行者123 更新时间:2023-11-28 21:27:11 25 4
gpt4 key购买 nike

我正在尝试编写一个 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 是我的 PATH 中可执行程序的别名。

我尝试过的一些排列组合(一次尝试一个):

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 时,它会按预期正确地开始运行程序,只是没有输入字符串。我显然在这里遗漏了一些基本的东西,我只是想不通是什么。任何帮助表示赞赏!

最佳答案

是的,您遗漏了一些基本的东西——管道由 shell 处理。要使用子进程执行您想要的操作,您应该将 vpfit95 作为子进程运行,然后与它进行通信。请参阅文档第 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 中产生它然后你可以在你的命令中使用一个管道,但是“切断中间人”更干净"并直接与子流程交互。

关于Python 子进程 Popen 将字符串传递给程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11517597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com