4

主文件

import subprocess,sys
process = subprocess.Popen([sys.executable]+['example.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

while True:
    out = process.stdout.read(1)
    if not out:
        out=process.stderr.read(1)
    if out == '' and process.poll() != None:
        break
    if out != '':
        print out

例子.py

f=raw_input('WHats your favorite animal')

好的,我想知道如何在主循环中检查输入并能够为其提供一些数据。现在,当我使用 raw_input 时,我的程序会冻结。

这是我想要的

while True:
    out = process.stdout.read(1)
    if not out:
        out=process.stderr.read(1)
    if out == '' and process.poll() != None:
        break
    #showing what i want
    if request_input==True:
        give_input('cat') #Give input to the raw_input
    #
    if out != '':
        print out

不知道有没有这样的功能。如果您需要更多解释,请发表评论。

4

4 回答 4

4

这实际上并不是进行进程间通信的最佳方式,我建议您使用多处理或线程库以及诸如队列或 PIPE 之类的东西来进行通信和同步。

队列将是共享数据的最简单方式,一个进程将输入一个值,另一个进程将获取这些值。

我已经修改了你的原始代码,所以它现在可以工作了,注意 raw_input 不会刷新标准输出,如果那里没有任何东西会挂起,http://code.activestate.com/lists/python-list/265749/这是为什么你的代码只是在等待标准输出......

这是危险的,它会产生死锁,使用风险自负,尝试另一种方法。

import sys
print 'Whats your favorite animal\n' #raw_input doesn't flush :( and we want to read in a whole line
sys.stdout.flush()
f = raw_input()
print f

和相应的 main.py

import subprocess, sys, os
process = subprocess.Popen([sys.executable]+['example.py'],
     stdout = subprocess.PIPE, stderr = subprocess.PIPE, stdin = subprocess.PIPE)

while True:
    if process.poll() != None:
        break
    request_input = process.stdout.readline() # read line, this will wait until there's actually a line to read.
    if request_input == "Whats your favorite animal\n":
        print 'request: %s sending: %s' % (request_input, 'cat')
        process.stdin.write('cat\n')
       process.stdin.flush()
于 2012-06-12T23:20:50.267 回答
1

编辑: 好像我误解了你的问题,对此感到抱歉。

这并不像您想象的那么容易:

您必须使用select检查是否有可用的数据stdin,如果有数据,请阅读!

最小的例子:

STDIN, STDOUT = 0, 1

while not process.poll() is None:
    out = process.stdout.read(1)

    if not out:
        break

    try:
        fds = select.select([STDIN], [], [])[0]
    except select.error:
        pass
    else:
        if STDIN in fds:
            data = os.read(STDIN, 1024)

            if data_requested:
                process.stdin.write(data)

要选择的信息:http ://docs.python.org/library/select.html#module-select、http : //linux.die.net/man/2/selecthttp://en.wikipedia.org/ wiki/Select_(Unix)

不确定这是否适用于 Windows,因为 Windows 仅支持select套接字。关于 SO 的相关问题:Windows 上最好的 epoll/kqueue/select 等效项是什么?

于 2012-06-16T14:42:57.243 回答
0

除非您坚持使用“原始 python”,否则最好使用 pexpect 模块。我已经在您的 example.py 中添加了一个输出,否则它一点也不好玩。

这是example.py:

    f=raw_input('WHats your favorite animal')
    print f.upper()

这是您正在寻找的 pexpect-example.py:

    # see http://pexpect.sourceforge.net/pexpect.html
    import pexpect

    PY_SCRIPT = 'example.py'

    child = pexpect.spawn('python %s' % PY_SCRIPT)

    child.expect ('WHats your favorite animal')

    # comment out these three lines if you run unmodified example.py script
    child.setecho(False)
    child.sendline ('cat')
    print PY_SCRIPT, 'said:', child.readline()
于 2012-06-22T16:09:41.873 回答
0

尝试使用多处理模块

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print num.value
    print arr[:]
于 2012-06-20T21:08:36.110 回答