gpt4 book ai didi

python - 删除Python中所有子进程的输出而无需访问代码

转载 作者:太空宇宙 更新时间:2023-11-03 14:51:24 24 4
gpt4 key购买 nike

在Python中我正在使用

sys.stdout = None 

在一些我无法控制的调用之前。这些调用可能会调用一些写入标准输出的子进程。

如何避免此子进程调用写入标准输出?

同样,我不拥有调用子进程的代码的所有权。看来 subprocess.Popen (和类似的)不尊重 sys.stdout。

最佳答案

是的,重定向sys.stdout仅适用于Python打印。当通过 subprocess 调用子流程时,Python 默认情况下不会捕获输出,并让流程正常执行。无法轻松地从流程中删除输出。

我想您可以创建一个与您无法更改的Python代码处于同一级别的subprocess.py文件(或在官方subprocess.py之前)来更改Popen 内容,但这意味着从 stub 模块导入官方模块,硬编码 python 路径,...可行,但有一个更简单的方法。

这是我测试过的 python 3 的快速破解方法,它有效:

  • 在 python 安装中找到文件 subprocess.py 并将其复制到您无法更改的模块旁边(在我的机器上C:\python34\lib\subprocess.py)
  • 在该文件中仅添加一行

代码(大约第 750 行):

def __init__(self, args, bufsize=-1, executable=None,
stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,
shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0,
restore_signals=True, start_new_session=False,
pass_fds=()):
"""Create new Popen instance."""

_cleanup()

现在添加(在_cleanup()之前):

    stderr = stdout = DEVNULL

强制标准输出和错误到空设备:无输出

现在的缺点:

  • 取决于安装的 python 版本。可以与其他版本一起使用,但不建议混合安装包。
  • 复制整个 subprocess.py 文件,而不是仅仅修补所需的调用

除此之外,这是一个 5 分钟的工作,而且很有效。我建议您将其保留为临时解决方案,并在某个时候对这个“无法更改的代码”执行一些操作。

关于python - 删除Python中所有子进程的输出而无需访问代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45881274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com