问题
问题是 ~/Downloads 路径。~ 由您调用时未启用的 shell 环境扩展subprocess.call
。下面是该问题的简化演示:
>>> import shlex, subprocess, os, os.path
>>> cmd = "ls ~/Downloads"
>>> print os.popen(cmd).read()
ubuntu-11.04-desktop-i386.iso
ubuntu-11.04-server-i386.iso
>>> print subprocess.check_output(shlex.split(cmd))
ls: cannot access ~/Downloads: No such file or directory
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 537, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['ls', '~/Downloads']' returned non-zero exit status 2
解决方案
您可以使用两种解决方案,在 python 中使用扩展 ~或使用参数os.path.expanduser
调用subprocess.call
/ 。我更喜欢使用over,因为它会返回命令可能产生的任何输出。以下任一解决方案都可以解决您的问题。subprocess.check_output
shell=True
check_output
call
import shlex, subprocess, os, os.path
cmd = 'ls ' + os.path.expanduser('~/Downloads')
print subprocess.check_output(shlex.split(cmd))
cmd = 'ls ~/Downloads'
print subprocess.check_output(cmd, shell=True)