<p>通过一些小的修复,您的代码可以运行:</p>
<ul>
<li>去掉了生成器函数,对线程没有意义</li>
<li>简化了从进程中获取输出的方法,但仍然是逐行读取(使用<code>communicate</code>读取最终输出可能会起作用,但您似乎需要立即打印行以了解当前的进度)</li>
<li>使用<code>Lock</code>保护输出,否则会在线程之间混淆</li>
<li>在管道中合并stdout和stderr以避免死锁</li>
</ul>
<p>固定代码:</p>
<pre><code>from subprocess import Popen, PIPE, STDOUT
import subprocess
import sys
from threading import Thread,Lock
lck = Lock()
def record ( _command):
lck.acquire()
print("Starting function")
print("Now executing the following command: " + _command)
lck.release()
process = Popen([_command], stdout=PIPE, stderr=STDOUT, shell=True)
while True:
line = process.stdout.readline()
if len(line)==0:
break
lck.acquire()
sys.stdout.write(line)
lck.release()
process.wait()
return_code = process.wait()
if return_code != 0:
raise subprocess.CalledProcessError(return_code, _command)
# main program
threads=[]
for i in range (0,5):
t=Thread(target=record,args=('ls',))
threads.append(t)
t.start()
# wait for all threads to finish
for t in threads:
t.join()
print("Exiting skript")
</code></pre>