将subprocess.check_output用于2>/dev/null的命令

A.P*_*.P. 5 python macos subprocess

我在Mac OS X Yosemite 10.10和Python 2.7上.

如果我输入以下内容:du -g -d1 /Users 2> /dev/null在命令行中,一切都很完美.

现在,我的目标是在python脚本中使用该命令.

我的想法是使用以下内容:

import subprocess

output = subprocess.check_output(['du', '-g', '-d1', '/Users', '/dev/null'])
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

Traceback (most recent call last):
  File "./verifications.py", line 1, in <module>
    output = subprocess.check_output(['du', '-g', '-d1', '/Users', '/dev/null'])
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 537, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['du', '-g', '-d1', '/Users', '/dev/null']' returned non-zero exit status 1
Run Code Online (Sandbox Code Playgroud)

此外,当我subprocess.check_output(['du', '-g', '-d1', '/Users', '/dev/null'])在本地运行一切正常时,错误发生在我使用Apple的共享屏幕工具登录共享iMac时.我有一种感觉,问题可能是由于权限,但我找不到任何东西.

Cha*_*ffy 8

因为2>/dev/null,控制文件描述符2与subprocess.Popen调用系列重定向的适当方法是stderr=:

# Python 2.x, or 3.0-3.2
output = subprocess.check_output(['du', '-g', '-d1', '/Users'],
                                 stderr=open('/dev/null', 'w'))
Run Code Online (Sandbox Code Playgroud)

...或者,支持Python subprocess.DEVNULL:

# Python 3.3 or newer
output = subprocess.check_output(['du', '-g', '-d1', '/Users'], stderr=subprocess.DEVNULL)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,就个人而言,我建议更像这样的事情:

p = subprocess.Popen(['du', '-g', '-d1', '/Users'],
                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
if p.returncode != 0:
  raise Exception(stderr)
Run Code Online (Sandbox Code Playgroud)

... 在命令失败的情况下,它不会发送stderr到,而是/dev/null保留它以用于生成有用的异常.(显然,选择一个合适的Exception子类).