得不到删除所有的Python子进程的输出代码

得不到删除所有的Python子进程的输出代码

问题描述:

在Python我使用得不到删除所有的Python子进程的输出代码

sys.stdout = None 

有的叫我不要管了。这些调用可能会调用一些写入stdout的子进程。

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

同样,我没有调用子进程的代码的所有权。 它似乎subprocess.Popen(和类似)不兑现sys.stdout。

+0

https://*.com/questions/2828953/silence-the-stdout-of-a-function-in-python-without-trashing-sys-stdout-and-resto 这是否有诀窍? – Uvar

是的,重定向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分钟的工作和它的作品。我建议你把它作为一个临时解决方案,并且你在这个“不能改变的代码”方面做些什么。

你可以与抑制stdoutstderr自定义函数替换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 

警告:

如果您有试图读取过程的输出代码,它就会失败。