子进程通配符的使用
- 2025-02-21 08:50:00
- admin 原创
- 51
问题描述:
import os
import subprocess
proc = subprocess.Popen(['ls','*.bc'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = proc.communicate()
print out
此脚本应打印所有带有 .bc 后缀的文件,但它返回一个空列表。如果我在命令行中手动执行 ls *.bc,它就可以正常工作。在脚本中执行 ['ls','test.bc'] 也可以正常工作,但由于某种原因,星号不起作用。有什么想法吗?
解决方案 1:
您需要提供shell=True
通过 shell 解释器执行命令。但是,如果您这样做,您不能再提供列表作为第一个参数,因为参数将被引用。相反,请指定要传递给 shell 的原始命令行:
proc = subprocess.Popen('ls *.bc', shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
解决方案 2:
扩展*
glob 是 shell 的一部分,但默认情况下subprocess
不会通过 shell 发送命令,因此会执行命令(第一个参数),然后使用ls
文字作为参数。*
这是一件好事,请参阅子进程文档“常用参数”部分中的警告块。它主要讨论安全隐患,但也有助于避免愚蠢的编程错误(因为无需担心魔法 shell 字符)
我的主要抱怨是shell=True
它通常意味着有更好的方法来解决问题 - 以你的例子来说,你应该使用模块glob
:
import glob
files = glob.glob("*.bc")
print files # ['file1.bc', 'file2.bc']
这将更快(没有进程启动开销),更可靠和跨平台(不依赖于具有命令的平台ls
)
解决方案 3:
除了这样做之外shell=True
,还要确保您的路径没有被引用。否则它将不会被 shell 扩展。
如果您的路径可能包含特殊字符,则必须手动将其转义。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD