簡體   English   中英

在Python subprocess.Popen函數中使用ls

[英]Using ls in Python subprocess.Popen function

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

當使用上面的代碼時,我得到錯誤提示:

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

但是,當我在shell中執行相同操作時,我沒有得到任何錯誤:

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

為什么第一個代碼失敗? 我想念什么?

您會收到錯誤消息,因為python 子進程無法像bash一樣擴展*。

像這樣更改代碼:

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

以下是有關python中的glob擴展和解決方案的更多信息: Python子進程中的Shell擴展

球形由外殼完成。 因此,當您在終端中運行ls *時,您的外殼實際上是在調用ls file1 file2 file3 ...

如果要執行類似的操作,則應查看glob模塊,或僅通過shell運行命令:

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

(如果選擇后者,請務必閱讀安全警告 !)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM