首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获runpy.run_module标准输出

捕获runpy.run_module标准输出
EN

Stack Overflow用户
提问于 2021-02-18 06:18:35
回答 2查看 318关注 0票数 0

我无法使用runpy.run_module将stdout捕获到变量中。

为了演示这个问题,我使用arg开关创建了一个名为runpy_test.py (下面的代码)的脚本;

  • 0 =不重定向stdout。
  • 1=使用StringIO重定向,捕获为变量,打印变量。

控制台输出

代码语言:javascript
复制
(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

代码语言:javascript
复制
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。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-02-18 22:50:22

使用subprocess.check_output而不是runpy.run_module解决了我的问题。

请参阅Installing python module within code

票数 0
EN

Stack Overflow用户

发布于 2022-04-20 04:47:57

您可以在pytest框架中使用capsys:

代码语言:javascript
复制
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!"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66254624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档