Python子进程通配符用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python子进程通配符用法相关的知识,希望对你有一定的参考价值。

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']也可以,但由于某些原因,星形符号不起作用..任何想法?

答案

您需要提供shell=True以通过shell解释器执行命令。但是,如果这样做,则不能再提供列表作为第一个参数,因为参数将被引用。而是指定原始命令行,因为您希望将其传递给shell:

 proc = subprocess.Popen('ls *.bc', shell=True,
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE)
另一答案

扩展* glob是shell的一部分,但默认情况下subprocess不会通过shell发送命令,因此执行命令(第一个参数ls),然后使用文字*作为参数。

这是一件好事,请参阅子流程文档的the warning block in the "Frequently Used Arguments" section。它主要讨论安全问题,但也可以帮助避免愚蠢的编程错误(因为没有魔术shell字符需要担心)

我对shell=True的主要抱怨是它通常意味着有一个更好的方法来解决这个问题 - 用你的例子,你应该使用the glob module

import glob
files = glob.glob("*.bc")
print files # ['file1.bc', 'file2.bc']

这将更快(没有进程启动开销),更可靠和跨平台(不依赖于具有ls命令的平台)

以上是关于Python子进程通配符用法的主要内容,如果未能解决你的问题,请参考以下文章

使用 asyncio 将 bash 作为 Python 的子进程运行,但 bash 提示被延迟

Python 子进程挂起命名管道

jquery中的$的特殊用法

python进程和线程中的join方法

Shell外壳的简易模拟

Python爬虫进阶六之多进程的用法