我正在开发一个多线程 python 脚本,我有一个专用线程负责执行一些 shell 命令,而无需重新打开一个全新的 zsh shell,但保持同一个会话处于活动状态。
主线程将待执行的命令放入队列中,该队列与负责执行命令的线程共享。
import threading, Queue
class ShellThread(threading.Thread):
def __init__(self, command_q, command_e):
super(ShellThread, self).__init__()
self.command_q = command_q
self.command_e = command_e
self.stoprequest = threading.Event()
from subprocess import Popen, PIPE
import os
self.zsh = Popen("zsh", stdin=PIPE, stdout=PIPE)
def run(self):
while not self.stoprequest.isSet():
try:
command = self.command_q.get(True, 0.1)
print "ShellThread is now executing command : " + command
self.zsh.stdin.write(command + '\n')
self.zsh.stdin.flush()
self.command_e.set()
except Queue.Empty:
continue
def join(self, timeout=None):
self.stoprequest.set()
self.zsh.stdin.close()
super(ShellThread, self).join(timeout)
def main(args):
__command_q = Queue.Queue()
__command_e = threading.Event()
__thread = ShellThread(command_q=__command_q, command_e=__command_e)
__thread.start()
while 1:
line = raw_input()
print 'MainThread : ' + line
__command_q.put(line)
__command_e.wait(0.5)
__command_e.clear()
if __name__ == '__main__':
import sys
main(sys.argv[1:])
它确实有效,但我有随机IOError: [Errno 32] Broken pipe
错误,我仍然没有找到一种方法来获取stdout
执行每个命令后的结果。
更新:
请注意,这样做的全部目的是保持一个且唯一的 zsh shell 打开(这就是为什么我为此目的有一个专用线程)以及时运行不同的命令。我不能使用Popen.communicate
,因为它会在命令结束后关闭 shell,而且我不知道我必须预先运行的所有命令。