2
import shlex,subprocess,os
cmd = "/Applications/LibreOffice.app/Contents/MacOS/swriter --headless --invisible --convert-to pdf:writer_pdf_Export --outdir ~/Downloads ~/Downloads/HS303.xlsx"
#This works
os.popen(cmd)
#This doesnot work
subprocess.call(shlex.split(cmd))

サブプロセス呼び出しが機能していません。これは Mac OSX で行われました。なぜこれが起こっているのかについて何か考えはありますか?

4

1 に答える 1

5

問題

問題は〜/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.callsubprocess.check_outputshell=Truecheck_outputcall

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)
于 2012-12-06T14:23:57.257 に答える