由于input
和raw_input()
停止程序运行,我想使用子进程来运行此程序......
while True: print raw_input()
并获得其输出。
这就是我的阅读计划:
import subprocess
process = subprocess.Popen('python subinput.py', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
output=process.stdout.read(12)
if output=='' and process.poll()!=None:
break
if output!='':
sys.stdout.write(output)
sys.stdout.flush()
当我运行它时,子进程几乎与它开始时一样快地退出。我该如何解决这个问题?
答案 0 :(得分:1)
我认为问题是子进程没有直接连接到stdout
和stdin
,因此无法接收键盘输入。大概是raw_input()抛出异常。
如果这是一个实际问题而不是实验,我建议您使用curses或pygame等库来处理输入。如果你正在尝试并想自己做,那么我想你将不得不查看线程而不是子进程,尽管这是一个相当复杂的尝试,所以你肯定会遇到其他问题。 / p>
答案 1 :(得分:1)
我担心它不会这样。
您认为subprocess
将附加您的控制台(您的特殊
stdin
)的情况。这不起作用,模块只有两个
用于指定:PIPE
和STDOUT
。
如果未指定任何内容,则子进程将无法使用
相应的流 - 它的输出将无处可去
没有输入。由于EOF,raw_input()
结束。
要走的路是在“主”程序中输入, 以及在子流程中完成的工作。
编辑:
以下是multiprocessing
from multiprocessing import Process, Pipe
import time
def child(conn):
while True:
print "Processing..."
time.sleep(1)
if conn.poll(0):
output = conn.recv()
print output
else:
print "I got nothing this time"
def parent():
parent_conn, child_conn = Pipe()
p = Process(target=child, args=(child_conn,))
p.start()
while True:
data = raw_input()
parent_conn.send(data)
# p.join() - you have to find some way to stop all this...
# like a specific message to quit etc.
if __name__ == '__main__':
parent()
你当然需要通过找到一种方法来使其更加健壮 这种合作。在我的示例中,两个进程都在同一个文件中, 但你可以用不同的方式组织它。
此示例适用于Linux,Windows上的管道可能存在一些问题, 但它应该是完全可以解决的。
“处理”是您想要做其他事情的部分,而不仅仅是 等待来自父母的数据。
答案 2 :(得分:0)
好吧,尝试不同的架构。您可以使用zeromq
。
Producer会生成所有项目(此处输出通过stdout发送)并通过zmq
广播。
消费者应该听取生产者正在广播的端口号并相应地处理它们。
以下是示例http://code.saghul.net/implementing-a-pubsub-based-application-with
Note
使用gevent
或multiprocessing
生成这些过程。
您将拥有master
计划,负责产生producer
和consumer