問題
問題は〜/Downloadsパスです。〜は、を呼び出したときに有効にされなかったシェル環境によって展開されます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
ソリューション
使用できる解決策は2つあります。Pythonで〜を使用して展開するか、引数を指定して/をos.path.expanduser
呼び出します。コマンドによって生成された可能性のある出力が返されるため、overを使用することをお勧めします。以下のいずれかの解決策で問題が解決するはずです。subprocess.call
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)