我无法使用runpy.run_module将stdout捕获到变量中。
为了演示这个问题,我使用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有关,但不太确定如何调试。任何想法都会很棒,解决方案会更好。
我的环境是Python3.6.10,使用conda 4.8.3。
提前谢谢。
发布于 2021-02-18 22:50:22
使用subprocess.check_output而不是runpy.run_module解决了我的问题。
发布于 2022-04-20 04:47:57
您可以在pytest框架中使用capsys:
def test_main(capsys):
runpy.run_module(
"helloworld",
init_globals=None,
run_name="__main__",
alter_sys=False)
captured = capsys.readouterr()
assert captured.out == "Hello, World!"https://stackoverflow.com/questions/66254624
复制相似问题