我正在处理一些使用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解决方法会损害可移植性
答案 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']