我正在尝试从我的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脚本。它只是挂起。
注意:线程通信需要在那里,因为我们需要将此代码与更大的模块集成。
答案 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()