2017-04-25 36 views
0

這樣確實不錯:蟒子 - 爲什麼引起爭論的空間中的錯誤

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

之間有很多的空間我使用Python 3.4.5在CentOS 6

+2

從殼嘗試'〜$「ls」的'-l'' –

回答

3

In unix I can write:

你不寫in unix。您將寫入外殼shell解析該輸出並在摺疊空白後生成一個列表。然後將['ls', '-l'](不包括空格!)的等價物傳遞給ls過程。

不同的shell可以以不同的方式處理空白。最讓你通過使用引號或反斜槓轉義空格。所以下面的,因爲它在Python的失敗一樣多在shell:

$ ls ' -l' 
ls: -l: No such file or directory 

隨着subprocess,除非你設置shell=True,你是不是傳遞的參數通過shell,你通過這個ls已啓動的進程。因此,您必須按照ls預期的方式交付這些參數,-之前沒有空格。

如果你需要打出命令和參數大致相同的方式外殼程序,使用shlex module

>>> import shlex 
>>> shlex.split("ls   -l") 
['ls', '-l'] 
>>> shlex.split("ls ' -l'") 
['ls', ' -l'] 
相關問題