2014-03-26 51 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