2014-03-26 92 views
4

運行子進程不會處理大括號正確大括號在Python POPEN

# Python 2.7.4 

import subprocess 
subprocess.Popen('ls src/*.cpp',shell=True): 
src/tonemap.cpp src/pch.cpp 

subprocess.Popen('ls src/{t,p}*.cpp', shell=True) 
ls: cannot access src/{p,t}*.cpp: No such file or directory 

同樣的程序將在不同的機器上工作與Python 2.7.2。兩個系統都使用bash shell。

你是我的原因,我該如何解決它?

編輯:

直接從命令行調用命令返回正確的結果:

ls src/{t,p}*.cpp 
src/tonamep.cpp src/pch.cpp 
+0

如何在Linux Mint上從2.7.4回滾到2.7.2? – memecs

+0

你的第二個例子適用於我......這兩個系統上有什麼外殼? –

+0

@TomFenech它們都是bash shell – memecs

回答

6

shell=True運行/bin/sh不支持此語法。明確指定bash

from subprocess import check_call 

check_call('ls src/{t,p}*.cpp', shell=True, executable='/bin/bash') 
+0

在某些系統上運行'/ bin/sh'然後運行'bash'嗎? –

+0

是的,工作! – memecs

+1

@TomFenech:在我的系統上運行'dash'。 '/ bin/sh'通常是「posix」ly。即使它運行'bash';它可能會以posix模式運行它。我不知道一個posix外殼是否應該支撐支架擴展。 – jfs

1

在你的情況,POPEN正確執行,從ls報告的錯誤。 執行命令時應該會出現同樣的錯誤:

ls src/{t,p}*.cpp 

終端中。

+0

正確,但shell調用的命令不是'ls src/{t,p} *。cpp' – memecs

+0

它發出了正確的命令。你爲什麼說它沒有引用你的命令? – user3

+0

因爲輸出不是'tonemap.cpp pch.cpp' – memecs

0

另一臺機器使用不處理該語法的不同shell。

+0

他們都是bash – memecs