使用python进行系统命令

时间:2014-04-08 14:17:06

标签: python command-line subprocess

我必须从python脚本运行以下简单的系统命令。

python wkhtmltopdf a.html b.pdf 

我写道:

import subprocess
commands_to_run  = ['python' 'wkhtmltopdf ','a.html', 'b.pdf']
subprocess.call(commands_to_run)

但它给出了错误:

2014-04-08 14:12:51,530 ERROR Exception in converting html to pdf
Traceback (most recent call last):
  File "/opt/cloodon/site/smamodule/views.py", line 28, in convert2pdf
    subprocess.call(commands_to_run)
  File "/usr/local/lib/python2.7/subprocess.py", line 486, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/local/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite)
  File "/usr/local/lib/python2.7/subprocess.py", line 1201, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

有些人可以解释我做错了什么。并且还对子进程模块有所了解吗?

2 个答案:

答案 0 :(得分:2)

你错过了一个逗号:

commands_to_run  = ['python', 'wkhtmltopdf', 'a.html', 'b.pdf']
                            ^

没有逗号'python' 'wkhtmltopdf''pythonwkhtmltopdf'String literal concatenation)相同:

>>> 'python' 'wkhtmltopdf'
'pythonwkhtmltopdf'

<强>更新

在第二个命令行参数后删除空格。

答案 1 :(得分:1)

只想分享两种方式让呼叫变得更容易。

1)使用一串命令和“shell = True”调用,这样就不必拆分命令了。例如,

subprocess.call("python wkhtmltopdf a.html b.pdf", shell=True)

2)如果安全性是“shell = True”(https://docs.python.org/2/library/subprocess.html#frequently-used-arguments)的问题,您可以在标准库中尝试shlex模块。例如,

import shlex
command = "python wkhtmltopdf a.html b.pdf"
subprocess.call(shlex.split(command))
当命令很复杂时,

shlex特别有用。