【问题标题】:Why does python time.sleep() appear to prevent asynchronous process reading?为什么 python time.sleep() 出现阻止异步进程读取?
【发布时间】: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


【解决方案1】:

尝试禁用 python 的输出缓冲,例如使用-u flag 运行 python。

欲了解更多信息,请参阅:Disable output buffering

【讨论】:

  • 我可以使用“-u”标志并且它可以工作。我可能会这样做。唯一的问题是我必须重写我正在执行的外部进程的 shebang 来完成此操作。在其他作品中,如果它是#!/usr/bin/anaconda/python,我会重写它。理想情况下,我将能够以编程方式进行。理想情况下,作为通用脚本的客户,我不想要求作者包含选项 -u。我知道我可能很挑剔。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多