我最近问过如何让python shell获取子进程输出。得到了非常有用的回应 - 即为POpen提供一个stdout = subprocess.PIPE
然后使用p.stdout.readline()并将结果提供给print()
p = subprocess.Popen(args, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, cwd=StartPath, shell=False)
it = iter(p.stdout.readline, b'')
sRet = "## decode Error ##"
for line in it:
try:
sRet = line.rstrip().decode('utf-8')
except:
pass
print(sRet[:PYTHON_WINDOW_WIDTH])
viRet = p.wait()
然而,当我从同一个多线程调用这个POpen时,我很担心会发生什么。
相同的subprocess.PIPE是每个POpen的fead。在每个readline获得两个子进程的结果的范围内。
除了得到一些奇怪的结果,每个循环(对于其中的行:)
似乎要等到两个线程子进程都完成后再继续
这不是我想要的。
提前致谢
答案 0 :(得分:0)
看起来我找到了答案 - 使用os.pipe()
结果如下所示:
r,w = os.pipe()
my_stdout=os.fdopen(r)
os.close(w)
p = subprocess.Popen(args, stdout=my_stdout, stdin=subprocess.PIPE, stderr=my_stdout, cwd=StartPath, shell=False)
it = iter(p.stdout.readline, b'')
sRet = "## decode Error ##"
for line in it:
try:
sRet = line.rstrip().decode('utf-8')
except:
pass
with MyGlobals.PrintLock:
print(sRet[:PYTHON_WINDOW_WIDTH])
viRet = p.wait()