0

我无法使用 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。
提前致谢。

4

1 回答 1

0

使用subprocess.check_output而不是runpy.run_module解决了我的问题。
请参阅在代码中安装 python 模块

于 2021-02-18T22:50:22.250 回答