【发布时间】: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