【问题标题】:Subprocess call fails子流程调用失败
【发布时间】:2012-11-24 09:58:47
【问题描述】:
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 中完成的。 知道为什么会这样吗?

【问题讨论】:

  • 请澄清“不工作”。任何子流程调用都有效吗?你得到什么结果,一个例外?
  • 我做了 check_output 但它打印 ' ',答案贴在下面

标签: python macos subprocess


【解决方案1】:

问题

问题在于 ~/Downloads 路径。 ~ 被调用subprocess.call 时未启用的shell 环境扩展。下面是问题的简化演示:

>>> 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 扩展 ~ 或使用参数 shell=True 调用 subprocess.call/subprocess.check_output。我更喜欢使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2018-02-05
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多