【问题标题】:One Python script giving "user input" to another python script一个 Python 脚本将“用户输入”提供给另一个 Python 脚本
【发布时间】:2014-02-19 08:43:43
【问题描述】:

这是我的第一个问题,我希望我做对了。 假设我有这些文件:

“simple.py”:

a=raw_input("your name?")
print "Hello",a

但使用不同的脚本,我想多次执行“simple.py”并自动提供输入,其工作方式如下:

“每个人.py”

run simple.py input=Alice
run simple.py input=Bob
...

得到 “你好爱丽丝” “你好鲍勃” ...

我知道使用 os.system 可以让“everyone.py”运行“simple.py”,但是有什么实用的方法来做这样的事情吗?如果第一个脚本多次要求输入怎么办?

重要的是我不能编辑 SIMPLE.PY,只能编辑另一个文件

提前致谢:)

【问题讨论】:

  • 为什么不能编辑simple.py?只是你不能改变它的行为吗?还是受第三方控制?
  • 受第三方控制

标签: python input automation python-2.x


【解决方案1】:

对于simple.py这样简单的情况,你应该可以使用subprocess.Popen

import subprocess

child = subprocess.Popen(['python', 'simple.py'], stdin=subprocess.PIPE)
child.communicate('Alice')

对于更复杂的情况,Pexpect 模块可能有用。它通过提供更方便、更健壮的接口来发送输入、等待提示和读取输出,从而帮助自动化与正常交互程序的交互。它应该适用于Popen 不起作用或更烦人的情况。

import pexpect

child = pexpect.spawn('python simple.py')
child.expect("your name?")
child.sendline('Alice')

【讨论】:

  • 既然您已经使用通信向孩子提供了输入,那么如何捕获孩子的输出并在此脚本中打印
【解决方案2】:
import sys
print "Hello",sys.argv[1]

运行 C:\Python26\python.exe simple.py Alice 会产生

你好爱丽丝

这里有一个很好的例子,说明如何从系统获取输入到 python 应用程序:

既然你没有提到你不能修改simple.py,那么你需要自动输入东西raw_input(),最快的方法就是简单地输入数据作为“输入”进入脚本:

C:> echo "爱丽丝" |运行 simple.py

【讨论】:

  • 哦,我的错,我之前没有提到我不能编辑第一个文件,只有第二个,即第一个应该总是要求用户输入,我想要在使用第二个脚本多次运行第一个脚本时使其自动运行。
  • 如果你不能编辑第一个文件..你运气不好。也许您可以输入类似C:> run simple.py < Alice 的内容,但如果您无法修改脚本,仅此而已。
  • 不会 run simple.py < "Alice" 查找名为 Alice 的文件并尝试从中提取输入吗?
  • @user2357112 不确定 Windows 是如何管道的。我只有 linux 机器可以使用,但我认为这是相同的基本原理。其中"' 是字符串,而不是要执行的命令,例如使用时:`
  • 我很确定它在 Windows 和 Unix 上是一样的。 Alice 也不会被视为命令;无论是否引用,都将被视为文件名。
【解决方案3】:

不幸的是,以上两个答案都不适合我,所以我想出了第三种解决方案供其他人尝试。

为了将输入从一个 python 文件发送到另一个(python 版本 3.7),我使用了三个文件。

  1. 运行子进程的文件
  2. 输出文件(非常简单)
  3. 需要输入的文件

这三个文件的顺序与上面相同。

您不需要打印输出,但我将在文件示例下方包含终端输出。 子进程文件:

from subprocess import Popen,PIPE

p1 = Popen(["python","output_file.py"], stdout=PIPE)
p2 = Popen(["python", "input_file.py"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()

output = p2.communicate()[0]

print(output)

输出文件非常简单,可能有办法解决它。不过,这是我的版本:

print(1)
print(2)
print('My String')

输入文件需要对数字进行类型转换。

i = input('Enter a number: ')
j = input('Enter another: ')
k = int(i) + int(j)
print(k)
l = input('Tell me something. ')
print(l)

这是终端输出:

b'Enter a number: Enter another: 3\r\nTell me something. My String!\r\n'

【讨论】:

    最近更新 更多