将 subprocess.check_output 用于带有 2>/dev/null 的命令
Using subprocess.check_output for a command with 2>/dev/null
我在 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 时。我感觉问题可能是权限问题,但我找不到任何东西。
对于 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'))
...或者,Python 支持 subprocess.DEVNULL
:
# 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 子类)。
我在 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 时。我感觉问题可能是权限问题,但我找不到任何东西。
对于 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'))
...或者,Python 支持 subprocess.DEVNULL
:
# 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 子类)。