使用Python';在一个脚本中运行另一个需要用户交互的Python脚本(通过原始输入)

使用Python';在一个脚本中运行另一个需要用户交互的Python脚本(通过原始输入),python,automation,subprocess,popen,Python,Automation,Subprocess,Popen,我的问题如下,我将用简单的例子来说明。我编写了一个需要用户交互的python脚本,特别是它使用raw_input()函数来获取用户的输入。下面的代码只是要求用户连续键入两个数字(在每个数字之间按enter键),然后返回答案(惊喜,惊喜,它被称为'sum_two_numbers.py')。呵呵 #! /usr/bin/python # ------------------- # sum_two_numbers.py # ------------------- # This script

我的问题如下,我将用简单的例子来说明。我编写了一个需要用户交互的python脚本,特别是它使用raw_input()函数来获取用户的输入。下面的代码只是要求用户连续键入两个数字(在每个数字之间按enter键),然后返回答案(惊喜,惊喜,它被称为'sum_two_numbers.py')。呵呵

#! /usr/bin/python

#  -------------------
#  sum_two_numbers.py
#  -------------------
#  This script asks the user for two numbers and returns the sum!

a = float(raw_input("Enter the first number:"))
b = float(raw_input("Enter the second number:"))

print a+b
现在,我想编写一个单独的python脚本来执行上面的脚本,并将两个必要的数字“馈送”给它。因此,我将此脚本称为“feeder.py”。我尝试使用Python的“”模块编写此脚本,特别是使用“Popen”类及其关联的“communicate”方法。下面是试图输入数字“5”和“4”的脚本

#! /usr/bin/python

#  ----------
#  feeder.py
#  ----------
import subprocess

child = subprocess.Popen("./sum_two_numbers.py",stdin=subprocess.PIPE)

child.communicate("5")
child.communicate("4")
此代码不工作,执行时返回错误:

$ ./feeder.py
Enter the first number:Enter the second number:Traceback (most recent call last):
  File "./sum_two_numbers.py", line 6, in <module>
    b = float(raw_input("Enter the second number:"))
EOFError: EOF when reading a line
Traceback (most recent call last):
  File "./feeder.py", line 8, in <module>
    child.communicate("4")
  File "/usr/lib/python2.7/subprocess.py", line 740, in communicate
    self.stdin.write(input)
ValueError: I/O operation on closed file
$。/feeder.py
输入第一个号码:输入第二个号码:回溯(最近一次通话):
文件“/sum\u two\u numbers.py”,第6行,在
b=浮点(原始输入(“输入第二个数字:”))
EOF:读取一行时的EOF
回溯(最近一次呼叫最后一次):
文件“/feeder.py”,第8行,在
儿童。沟通(“4”)
文件“/usr/lib/python2.7/subprocess.py”,第740行
self.stdin.write(输入)
ValueError:对关闭的文件执行I/O操作
我不知道如何编写'feeder.py',这样它就能做我想做的事情,这些错误一直在阻碍我。我怀疑此错误是由于文档中的以下注释引起的:

Popen.communicate(输入=无)

与进程交互:向stdin发送数据。从stdout和stderr读取数据,直到 已到达文件末尾。等待进程终止

我不知道该如何理解这句话,它如何能帮助我


谁能帮助我使上述脚本工作,即如何正确使用子流程和Popen。。。或者仅仅是如何写一个“feeder”脚本——用任何(不太晦涩的)语言!我尝试过Pexpect,Expect,但遇到了一些问题,比如它没有输出子代码的输入请求,我通常不知道它在做什么。

您只能调用
通信
一次。因此,您需要一次传递所有输入,即
child.communicate(“1\n1\n”)
。或者,您也可以写信给stdin:

child = subprocess.Popen("./test.py", stdin=subprocess.PIPE)         

child.stdin.write("1\n")                                                       
child.stdin.write("1\n")

如果编写
child.communicate(“4\n”)取而代之?@HristoIliev谢谢你的建议!我试图在代码中添加新的换行符,但基本错误仍然存在。错误相同,只是将“4”替换为“4\n”。还有,我试过了,没有你的分号。谢谢你的尝试!哦,对不起分号。坏习惯:)如果我正确阅读了帮助文本,您不能在同一管道上多次调用
communicate
。然后试试这个:
child.communication(“5\n4\n”)
@HristoIliev::)酷!我会在SSH进入我的工作站后立即尝试!另外,我能想到最坏的习惯@赫里斯托利耶夫:谢谢!你的建议行得通!下面的Rob Wouters给出了一个很好的替代方案,在语法上更能让程序员满意。我给了罗布一个绿色的勾号,并给了你一个向上的投票:)非常感谢罗布,这就是我想要的!我运行了您的代码,它运行得很好。:)你帮我省去了很多头痛,对此我非常感激!我可能有点贪心,但如果终端真的能打印出“写”给孩子的内容就好了,但我可能会挑剔。。。