我必须从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
有些人可以解释我做错了什么。并且还对子进程模块有所了解吗?
答案 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特别有用。