Popen.stdin有多线程问题,不起作用

时间:2011-07-20 17:12:34

标签: python multithreading stdin

我正在尝试从我的python程序运行一个shell。 我使用了mltithreaded方法,其中接受来自用户的输入,并且应该通过shell执行。

一切似乎都是正确的,除了程序执行不会超出标准输入。

我不确定使用Popen.stdin的方式是否有问题。

所以请帮助解决这里的错误。

from subprocess import Popen,PIPE
import shlex
import threading
from Queue import Queue


class MyThread(threading.Thread):
    def __init__(self,func,args):
        threading.Thread.__init__(self)
        self.func=func
        self.args=args

    def run(self):
        apply(self.func,self.args)



def bash(command,output):
    commandList=shlex.split('python test.py')   
    process=Popen(commandList,stdout=PIPE,stdin=PIPE,stderr=PIPE,shell=True)
    print process.stdout.readlines()
    while (process.pole()==None):
        #commandList=shlex.split(command.get(1))
        print 'bash'
        process.stdin.write(command.get(1))
        process.stdin.flush()
        output.put(process.stdout.readlines(),1)
        process.stdout.flush()



def communicate(command,output):
    while True:
        command.put(raw_input('enter command>'))
        print 'communicate'
        print output.get(1)



funcs=[bash,communicate]
nfuncs=len(funcs)    

def main():

    command=Queue(1)
    output=Queue(1)
    threads=[]

    for i in range(nfuncs):
        t=MyThread(funcs[i],(command,output))
        threads.append(t)

    for i in range(nfuncs):
        threads[i].start()

    for i in range(nfuncs):
        threads[i].join()

    print 'successful'       

if __name__=='__main__':
    main()

我已经给出了下面的输出。

karthik@ubuntu:~/TerminalChatBot/test$ python threadTerminal.py
enter command>ls
communicate

此后没有执行。我甚至无法使用ctrl + c来停止python脚本。它只是挂起。

注意:线程通信需要在那里,因为我们需要将此代码与更大的模块集成。

2 个答案:

答案 0 :(得分:0)

可能是它一直挂在process.stdout.readlines()上吗?也许找不到行结尾。尝试stdout.read(1)读取一个字符,看看会发生什么。

答案 1 :(得分:0)

小事:

process.poll()而不是process.pole()

而不是

 for i in range(nfuncs):
    t=MyThread(funcs[i],(command,output))
    threads.append(t)

 for func in nfuncs:
    t=MyThread(func,(command,output))
    threads.append(t)

现在,你为什么要运行python test.py?你不想在shell中运行ls communicate,在这种情况下你应该做类似的事情:

def bash(command,output):
    process=Popen('bash',stdout=PIPE,stdin=PIPE,stderr=PIPE,shell=True)
    print process.stdout.readlines()
    # I don't really understand what's going on here
    while (process.pole()==None):
        print 'bash'
        process.stdin.write(command.get(1))
        process.stdin.flush()
        output.put(process.stdout.readlines(),1)
        process.stdout.flush()