这确实很好用:
import subprocess
subprocess.check_call(["ls","-l"])
但这一行会导致错误:
>>> subprocess.check_call(["ls"," -l"])
ls: cannot access -l: No such file or directory
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.4/subprocess.py", line 558, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['ls', ' -l']' returned non-zero exit status 2
为什么会这样?
在unix中我可以写:
ls -l
ls
和-l
之间有很多空格
我在Centos 6上使用Python 3.4.5
答案 0 :(得分:3)
在unix中我可以写:
你不能在unix 中写下。你在shell中写了 。在折叠空格之后, shell 解析该输出并生成列表。然后它将等效的['ls', '-l']
(无空格!)传递给ls
进程。
不同的shell可以不同地处理空白。大多数情况下,您可以使用引号或反斜杠来转义空格。因此,以下内容在shell中的失败与在Python中失败一样:
$ ls ' -l'
ls: -l: No such file or directory
使用subprocess
,除非您设置shell=True
,否则不会通过shell传递参数,而是将直接传递给ls
进程,即开始。因此,您必须按照ls
期望的方式提供这些参数,而-
选项之前没有空格。
如果您需要以与shell类似的方式拆分命令和参数,请使用shlex
module:
>>> import shlex
>>> shlex.split("ls -l")
['ls', '-l']
>>> shlex.split("ls ' -l'")
['ls', ' -l']