使用Python的CLI前端:如何将字符串传递给正在运行的进程?

时间:2012-06-18 04:58:00

标签: python process fork subprocess stdin

如何在python中将字符串/数据发送到正在运行的进程的STDIN?

我想为CLI程序创建一个前端。例如。我想将多个字符串传递给此Pascal应用程序:

program spam;
var a,b,c:string;
begin
while e <> "no" do
begin
    writeln('what is your name?');
    readln(a);
    writeln('what is your quest?');
    readln(b);
    writeln('what is your favorite color?');
    readln(c);
    print(a,b,c);
end;
end.

如何从python(使用python中的子进程模块)将字符串传递给此程序。谢谢。对不起我的英文。

1 个答案:

答案 0 :(得分:2)

如果您想控制另一个交互式程序,可能值得尝试Pexpect module。它旨在查找提示消息等,并与程序进行交互。请注意,它目前不能直接在Windows上运行 - 它可以在Cygwin下运行。

可能的非Cygwin Windows变体是WinPexpect,我通过this question找到了它。关于该问题的答案之一表明最新版本的WinPexpect位于http://sage.math.washington.edu/home/goreckc/sage/wexpect/,但是看看修改日期我认为BitBucket(第一个链接)实际上是最新的。

由于Windows终端与Unix终端有些不同,我认为没有直接的跨平台解决方案。但是,WinPexpect文档说它与pexpect之间API的唯一区别是spawn函数的名称。您可能会执行以下(未经测试的)代码以使其在两者中都起作用:

try:
    import pexpect
    spawn = pexpect.spawn
except ImportError:
    import winpexpect
    spawn = winpexpect.winspawn

# NB. Errors may occur when you run spawn rather than (or as
# well as) when you import it, so you may have to wrap this 
# up in a try...except block and handle them appropriately.
child = spawn('command and args')