python subprocess - 为什么会导致参数中的空格出错

时间:2017-04-25 12:36:56

标签: python subprocess

这确实很好用:

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

1 个答案:

答案 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']