如何解决捕获 runpy.run_module 标准输出
我无法使用 StringIO 将 runpy.run_module 的标准输出捕获到变量中。
为了演示这个问题,我使用 arg 开关创建了一个名为 runpy_test.py(下面的代码)的脚本;
控制台输出
(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
在打印之前没有正确重新初始化,但不确定如何调试。任何想法都会很棒,解决方案甚至更好。
我的环境是 Python 3.6.10,使用 conda 4.8.3。
提前致谢。
解决方法
使用 subprocess.check_output
而不是 runpy.run_module
解决了我的问题。
见Installing python module within code
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。