使用 optparse 捕获文件系统 glob

Capturing filesystem globs using optparse

我正在编写一些 Python 代码,它使用 optparse 获取一些输入文件的名称,然后(在纸上)尽可能使用 glob.glob() 扩展该输入。

然而,我的 shell (zsh) 似乎在传递给 Python 之前扩展了 glob。例如,如果我 运行 python myscript.py *.txt,我将获得第一个匹配的 .txt 文件而不是文字 glob *.txt。这对我来说没什么用。

我认为这更多是 shell 方面的问题;但考虑到便携性,我想知道是否有 Python 方面的解决方案。

optparse 用于此的代码:

p = OptionParser()
p.add_option('-f', '--infile', dest='input', action='store', type='string')
(options, args) = p.parse_args()

以下最小示例可重现该问题(该示例还表明它扩展到使用 sys.argv 手动提取参数):

$ ls *.txt
file1.txt    file2.txt    file3.txt
$ python -c 'import sys; print sys.argv' *.txt
['-c', 'file1.txt', 'file2.txt', 'file3.txt']

所以,为了清楚起见,我正在寻找一种方法将 glob 文字 传递给我的 python 代码,以便在那里扩展它,使用 Python,因为 shell 解决方法会损害可移植性。

您可以转义通配符,这样 shell 就不会为您进行通配:

$ ls *.txt
file1.txt   file2.txt   file3.txt
$ python -c 'import sys; print sys.argv' *.txt
['-c', 'file1.txt', 'file2.txt', 'file3.txt']
$ python -c 'import sys; print sys.argv' \*.txt
['-c', '*.txt']

如果这是您传递的唯一参数,那么 glob 扩展的其余部分将被解析元组的位置参数部分吸收,所以也许尝试使用它?

from optparse import OptionParser

p = OptionParser()
p.add_option('-f', '--filename', dest='input', action='store', type='string')
options, args = p.parse_args()

print options
print args

给你:

$ ls *.txt
failure_counts.txt  iscsi-targets.txt  README.txt  snmp.txt  success_counts.txt
$ python glob.py -f *.txt
{'input': 'failure_counts.txt'}
['iscsi-targets.txt', 'README.txt', 'snmp.txt', 'success_counts.txt']