2013-04-12 107 views
2
proc = subprocess.Popen(['ls', '-v', self.localDbPath+'labris.urls.*'], stdout=subprocess.PIPE) 
while True: 
    line = proc.stdout.readline() 
    if line != '': 
     print line 
    else: 
     break 

當使用上面的代碼我得到的錯誤說:在Python subprocess.Popen功能使用ls命令

ls: /var/lib/labrisDB/labris.urls.*: No such file or directory 

但是,當我DIO一樣從貝殼我沒有得到任何錯誤:

ls -v /var/lib/labrisDB/labris.urls.* 

而且這不會給任何錯誤之一:

proc = subprocess.Popen(['ls', '-v', self.localDbPath], stdout=subprocess.PIPE) 
while True: 
    line = proc.stdout.readline() 
    if line != '': 
     print line 
    else: 
     break 

爲什麼第一個代碼失敗?我錯過了什麼?

+0

也許使用這樣就會解決http://stackoverflow.com/questions/9997048 /蟒-子通配符使用率 – denizeren

回答

1

Globbing由shell完成。所以當你在終端中運行ls *時,你的shell實際上是調用ls file1 file2 file3 ...

如果你想要做同樣的事情,你應該有一個看看glob模塊,或者只是通過shell中運行你的命令:

proc = subprocess.Popen('ls -v ' + self.localDbPath + 'labris.urls.*', 
         shell=True, 
         stdout=subprocess.PIPE) 

(如果你選擇後者,請務必閱讀security warnings!)

5

因爲Python 沒有可能能夠擴大*像慶典你得到錯誤。

更改代碼這樣的:

from glob import glob 
proc = subprocess.Popen(['ls', '-v'] + glob(self.localDbPath+'labris.urls.*'), stdout=subprocess.PIPE) 

下面是關於蟒蛇水珠擴張和解決方案的更多信息:Shell expansion in Python subprocess