使用optparse捕获文件系统globs

时间:2015-06-08 15:57:54

标签: python shell glob

我正在处理一些使用optparse获取某些输入文件名称的Python代码,然后(在纸面上)尽可能使用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 literal 传递给我的python代码,使用Python扩展它,因为shell解决方法会损害可移植性

2 个答案:

答案 0 :(得分:1)

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

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']

答案 1 :(得分:0)

您可以转义通配符,以便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']