python Popen中的花括号
正在运行的子进程无法正确处理大括号python Popen中的花括号,python,python-2.7,subprocess,popen,Python,Python 2.7,Subprocess,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
# 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
在您的情况下,Popen执行正确,错误从
ls
报告。
执行命令时,它应给出相同的错误:
ls src/{t,p}*.cpp
在终端中。另一台计算机使用不处理该语法的不同shell。
shell=True
运行不支持该语法的/bin/sh
。明确指定bash
:
from subprocess import check_call
check_call('ls src/{t,p}*.cpp', shell=True, executable='/bin/bash')
我如何在Linux Mint上从2.7.4回滚到2.7.2呢?你的第二个例子对我很有用……两个系统上都有什么shell?@TomFenech它们都是bash shell,当你在“坏”的系统上运行
ls src/{t,p}*.cpp
时,shell中发生了什么?是的,输出是预期的“tonemap.cpp.cpp”。对,但是shell调用的命令不是'ls src/{t,p}*.cpp',而是发出了正确的命令。你为什么说它没有调用你的命令?因为输出不是“tonemap.cpp pch.cpp”当你在命令行/终端中执行ls src/{t,p}*.cpp时会发生什么?它可以工作,输出是“tonemap.cpp pch.cpp”,正如预期的那样在一些系统上运行bash
,然后呢?@TomFenech:在我的系统上它运行dash
/bin/sh
通常是“posix”ly。即使它运行bash
;它可能在posix模式下运行。我不知道posix shell是否应该支持大括号扩展。为了确认,posix shell不支持大括号扩展。