我无法使用 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)
,但正如您从上面的控制台捕获中看到的那样,我什么也没得到。
运行py_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。
提前致谢。