私はPythonプログラムからシェルを実行しようとしています。 私は、ユーザーからの入力が受け入れられ、シェル経由で実行されるmltithreadedアプローチを使用しました。Popen.stdinでマルチスレッドの問題が発生しました。
プログラムの実行がstdinを超えて行われないことを除いて、すべてが正しいように見えます。
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()
次の出力を示しました。
[email protected]:~/TerminalChatBot/test$ python threadTerminal.py
enter command>ls
communicate
これ以降は実行されません。私もCtrl + Cを使用してPythonスクリプトを停止することはできません。それはちょうどハングアップします。
注:このコードをより大きなモジュールと統合する必要があるので、スレッド通信がそこにある必要があります。
を、私はあなたが[ 'multiprocessing'](HTTPを使用することをお勧め.python.org/library/multiprocessing.html) 'サブプロセス' + 'threading' – mac
なぜマルチスレッドではなく、Pythonのマルチプロセスアプローチを使用していますか? – Cinquo