【问题标题】:python subprocess: check to see if the executed script is asking for user inputpython子进程:检查执行的脚本是否要求用户输入
【发布时间】:2016-06-15 13:06:52
【问题描述】:
import subprocess

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

我知道你可以通过通信与执行的脚本通信 如何检查脚本“simple.py”是否要求用户输入?

simple.py 可以要求 5-10 个用户输入,所以简单地硬编码 communicate 是不够的。

[编辑]:想要在脚本运行时解析标准输出并与脚本通信

while True:
    if child.get_stdout() == '?':
       # send user input

【问题讨论】:

  • 你不能。程序不要求输入;他们等着。
  • 我怎么知道他们是否在等待它......(询问/等待)我看不出区别
  • 你不能。当它等待输入时,它什么也不做,直到它得到它。什么都不做的原因有很多,所以没有办法知道它是专门在等待输入的。
  • 我知道它在等待用户输入的标准输出。当脚本打印出来时,我如何获得标准输出?
  • 你可以在/proc/<pid>/wchan查看等待通道,也可以用ptrace/strace/随便你跟踪子进程。

标签: python subprocess


【解决方案1】:

一个简单的例子:

simple.py:

i = raw_input("what is your name\n")
print(i)
j = raw_input("What is your age\n")
print(j)

读写:

import subprocess

child = subprocess.Popen(['python2', 'simple.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

for line in iter(child.stdout.readline, ""):
    print(line)
    if "name" in line:
        child.stdin.write("foo\n")
    elif "age" in line:
        child.stdin.write("100\n")

输出:

what is your name

foo

What is your age

100

【讨论】:

  • 谢谢!这就是我要找的
  • @ealeon:当心,除非你确切地知道你应该写/读多少;如果输入/输出不同步,则很容易挂起子进程(如果您尝试读取太多;您可能会无限期地等待永远不会出现的输入,或者如果您尝试写入太多,那么尽快由于相应的操作系统管道缓冲区已满,writes 可能会阻塞)。通常,您应该使用线程或异步。如果您要处理多个管道(如本例中),则为 I/O。
猜你喜欢
  • 2018-10-23
  • 2014-04-08
  • 1970-01-01
  • 2011-08-30
  • 2015-07-09
  • 1970-01-01
  • 2021-07-12
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多