python - 将 subprocess.check_output 用于带有 2>/dev/null 的命令

标签 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 时发生错误。我感觉问题可能是权限问题,但我找不到任何东西。

最佳答案

对于 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 子类)。

关于python - 将 subprocess.check_output 用于带有 2>/dev/null 的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30896927/

相关文章:

macos - 通过 launchd 在关机时运行 Shell 脚本

python - 如何从一个 subprocess.Popen 命令同步运行多个命令?

python - Google应用程序引擎本地主机服务器错误python

python - 如何在 ipywidgets Python 的选项卡中显示 interact()

python - 矩阵中每行的特定案例计数

python - 尝试根据说明安装 Django-Treebeard 时出现异常

objective-c - 将 NSView 绘制到 NSGraphicsContext 中?

javascript - 如何在 Windows、Mac、Android 中使用 Seed 用 Ja​​vaScript 编写独立应用程序?

python - 使用subprocess.popen SSH,无法输入密码

python 子进程: check to see if the executed script is asking for user input