2012-12-14 60 views
2

我在看this的問題。Python子流程Popen:爲什麼「ls * .txt」不起作用?

在我的情況,我想做一個:

import subprocess 
p = subprocess.Popen(['ls', 'folder/*.txt'], stdout=subprocess.PIPE, 
           stderr=subprocess.PIPE) 

out, err = p.communicate() 

現在我可以檢查上做的「ls文件夾/ * TXT。」工作的命令行,作爲文件夾有很多.txt文件。

但是在Python(2.6),我得到:

LS:不能訪問*:

我已經試過沒有這樣的文件或目錄做: r'folder/\*.txt' r"folder/\*.txt" r'folder/\\*.txt' 和其他變化,但它似乎Popen不喜歡*字符。

有沒有別的辦法可以逃脫*

+0

Escape it?我想你想要的是首先展開「*」,然後運行ls命令。閱讀「外殼擴展」。 –

回答

8

*.txt自動被您的shell擴展爲file1.txt file2.txt ...。如果你引用*.txt,這是行不通的:

[~] ls "*.py"                 
ls: cannot access *.py: No such file or directory 
[~] ls *.py                  
file1.py file2.py file3.py 

如果你想獲得匹配您的模式的文件,使用glob

>>> import glob 
>>> glob.glob('/etc/r*.conf') 
['/etc/request-key.conf', '/etc/resolv.conf', '/etc/rc.conf'] 
+0

謝謝。在Python中使用Popen時,必須使用引號。請參閱鏈接的答案或Python文檔。 – aaa

+0

@aaa:問題是你沒有使用shell,這將不允許使用globbing。用'Popen'調用'ls'並不是一個好主意,IMO,因爲Python爲此提供了更好的工具。 – Blender

+0

啊,現在我明白了。是的,你是對的,glob是一個更好的圖書館。看,我剛剛學到一件新東西:) – aaa

6

您可以將參數傳遞外殼爲True。它會允許通過。

import subprocess 
p = subprocess.Popen('ls folder/*.txt', 
        shell=True, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE) 
out, err = p.communicate() 
+1

是的,這個工程。我錯誤地認爲對Popen的參數必須排列,因爲這就是所有示例的做法 – aaa

+0

p.communicate()是一個阻塞調用,我們可以以非阻塞方式具有相同的行爲嗎?謝謝 – Codeanu