【问题标题】:Capturing runpy.run_module stdout捕获 runpy.run_module 标准输出
【发布时间】:2021-05-21 02:09:50
【问题描述】:

我无法使用 StringIO 将 runpy.run_module 的标准输出捕获到变量中。
为了演示这个问题,我使用 arg 开关创建了一个名为 runpy_test.py 的脚本(代码如下);

  • 0 = 不重定向标准输出。
  • 1 = 使用 StringIO 重定向,捕获到变量,打印变量。

控制台输出

(base) PS C:\Users\justi\Documents> python .\runpy_test.py 0  
pip 20.0.2 from C:\ProgramData\Anaconda3\lib\site-packages\pip (python 3.6)  
(base) PS C:\Users\justi\Documents> python .\runpy_test.py 1  
(base) PS C:\Users\justi\Documents>  

我原以为 python .\runpy_test.py 1 会打印 pip 20.0.2 from C:\ProgramData\Anaconda3\lib\site-packages\pip (python 3.6),但正如您从上面的控制台捕获中看到的那样,我什么也没得到。

runpy_test.py

import io
import sys
import runpy
import copy

capture_stdout = bool(sys.argv[1] == "1")
if capture_stdout:
    _stdout = sys.stdout
    sys.stdout = io.StringIO()
_argv = copy.deepcopy(sys.argv)
sys.argv = ['', '-V']
runpy.run_module("pip", run_name="__main__")
sys.argv = _argv
if capture_stdout:
    result = sys.stdout.getvalue()
    sys.stdout = _stdout
    print(f"result: {result}")

我猜sys.stdout 在打印之前没有被正确地重新初始化,因为与runpy.run_module 有关,但不确定如何调试。任何想法都会很棒,解决方案会更好。
我的环境是使用 conda 4.8.3 的 Python 3.6.10。
提前致谢。

【问题讨论】:

    标签: python-3.x stdout stringio runpy


    【解决方案1】:

    使用subprocess.check_output 而不是runpy.run_module 解决了我的问题。
    Installing python module within code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      相关资源
      最近更新 更多