Python Popen中的花括号

5

运行子进程不能正确处理花括号

# 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

我该如何在Linux Mint上从2.7.4回滚到2.7.2? - memecs
你的第二个示例对我有效...两个系统上使用的是什么Shell? - Tom Fenech
@TomFenech 它们都是Bash Shell。 - memecs
当您在“损坏”的系统上运行ls src/{t,p}*.cpp时,Shell会发生什么情况?它能正常工作吗? - Tom Fenech
是的,它有效,输出与预期的一样是“tonemap.cpp pch.cpp”。 - memecs
3个回答

10

shell=True 运行的是不支持这种语法的 /bin/sh。需要明确指定 bash

from subprocess import check_call

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

在某些系统上,/bin/sh 运行的是 bash 吗? - Tom Fenech
2
@TomFenech:在我的系统上,它运行的是“dash”。/bin/sh通常是“posix”方式。即使它运行bash,它可能也是以posix模式运行的。我不知道posix shell是否应该支持花括号扩展。 - jfs
1
确认一下,POSIX shell 不支持 大括号扩展。 - chepner

1
在您的情况下,Popen执行正确,错误来自ls。当您执行命令时,应该会出现相同的错误:
ls src/{t,p}*.cpp

在终端中。

没错,但是由shell调用的命令不是'ls src/{t,p}*.cpp'。 - memecs
因为输出不是“tonemap.cpp pch.cpp”。 - memecs
它有效了,输出与预期的一样是“tonemap.cpp pch.cpp”。 - memecs
你能通过从Popen和终端中发出“which ls”命令来找到正在使用的ls吗? - venpa
谢谢。它显示了问题所在。来自bin的ls不处理这个语法(我已经在Mac上验证过)。我认为你可以遵循J.F. Sebastian的答案。 - venpa
显示剩余3条评论

0
另一台机器使用不同的 shell,无法处理该语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接