得不到删除所有的Python子进程的输出代码
问题描述:
在Python我使用得不到删除所有的Python子进程的输出代码
sys.stdout = None
有的叫我不要管了。这些调用可能会调用一些写入stdout的子进程。
如何避免这个子进程调用写入标准输出?
同样,我没有调用子进程的代码的所有权。 它似乎subprocess.Popen(和类似)不兑现sys.stdout。
答
是的,重定向sys.stdout
只适用于python打印。当通过subprocess
调用子进程时,python默认不捕获输出,并使进程正常执行。无法轻松地从流程中删除输出。
我想你可以在同一水平Python代码你不能改变(或前官员subprocess.py
)改变Popen
内容创建subprocess.py
文件,但是这将意味着从存根模块导入正式模块,硬编码蟒蛇路径,...可行,但有一个更简单的方法。
这里有一个快速的黑客为Python 3,我测试,其工作原理:
- 找到该文件
subprocess.py
在Python安装并复制它放在一边,你不能改变的模块(我的机器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
强制标准输出和错误为null装置:采用无输出
现在的缺点:
- 取决于所安装的Python版本。可以与其他版本一起工作,但不建议混合包。
- 拷贝整个文件
subprocess.py
而不只是修补所需的调用
除此之外,它是有5分钟的工作和它的作品。我建议你把它作为一个临时解决方案,并且你在这个“不能改变的代码”方面做些什么。
答
你可以与抑制stdout
和stderr
自定义函数替换subprocess.Popen
:
import subprocess
import inspect
def Popen(*args, **kwargs):
sig = inspect.signature(real_popen)
bound_args = sig.bind(*args, **kwargs).arguments
bound_args['stdout'] = subprocess.DEVNULL
bound_args['stderr'] = subprocess.DEVNULL
return real_popen(**bound_args)
real_popen = subprocess.Popen
subprocess.Popen = Popen
警告:
如果您有试图读取过程的输出代码,它就会失败。
https://stackoverflow.com/questions/2828953/silence-the-stdout-of-a-function-in-python-without-trashing-sys-stdout-and-resto 这是否有诀窍? – Uvar