使用 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']
我正在编写一些 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']