【发布时间】:2017-06-24 14:57:46
【问题描述】:
我有一些 python 代码,我想将其作为子进程打开。 我已经尝试通过 subprocess.Popen() 以及来自另一个 Python 脚本的 asyncio 对进程进行线程化。我知道添加 time.sleep() 会阻止在程序产生输出时读取进程输出,但是耗时的大循环具有相同的效果。有趣的是,我尝试的任何东西都可以在 Eclipse 中使用 PyDev,但是如果我从 shell 运行我的程序,它只会在程序最终完成运行时输出。我需要能够在程序进行时读取输出到标准输出。任何帮助将不胜感激。
# would like to call this python script as a subprocess from another program.
import time
import sys
for j in range( 50000000000 ):
print("blah") # if this is removed asynchronous reading occurs just fine
time.sleep(1)
#for k in range( 10000000 ): # this would also cause output to wait until program is complete
# b=2
print("\n"*2)
【问题讨论】:
-
这有帮助吗:stackoverflow.com/q/107705/57952 ?
-
是的,这行得通。我使用了“unbuff”类,当我尝试执行 proc.stdout.readline() 时,从调用者使用 Popen 并使用 stdout= subp.PIPE 作为 Popen 的 arg 时遇到了并发症,所以我选择了 os.environ [ 'PYTHONUNBUFFERED] = 1。我不知道更喜欢哪个。我有点喜欢使用 Unburffered 类并更改流,因为它不会影响整个 Python 环境。知道如何通过将 stdout 设置为 PIPE 和 proc.stdout.readline() 来使其正常工作吗?设置 OS var 是否有缺点,比如弄乱了正常打印的方式?
标签: python subprocess