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时.我有一种感觉,问题可能是由于权限,但我找不到任何东西.
因为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子类).
| 归档时间: |
|
| 查看次数: |
4080 次 |
| 最近记录: |