将subprocess.check_output用于具有2> / dev / null

时间:2015-06-17 16:11:15

标签: 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'])

但是我收到了这个错误:

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

...而不是将stderr发送到/dev/null,而不是将其用于在命令失败时生成有用的异常。 (显然,选择一个合适的Exception子类)。