6

我目前有一个脚本,它通过如下sys.argv变量使用文件通配符:

if len(sys.argv) > 1:
        for filename in sys.argv[1:]:

这非常适合处理一堆文件;但是,我也想将它与argparse模块一起使用。所以,我希望我的程序能够处理以下内容:

foo@bar:~$ myScript.py --filter=xyz *.avi

有没有人尝试过这样做,或者对如何进行有一些指示?

4

2 回答 2

17

如果我理解正确,那么您的问题是关于将文件列表以及一些标志或可选参数传递给命令。如果我说对了,那么您只需要利用 argparse 中的参数设置:

文件p.py

import argparse

parser = argparse.ArgumentParser(description='SO test.')
parser.add_argument('--doh', action='store_true')
parser.add_argument('files', nargs='*')  # This is it!!
args = parser.parse_args()
print(args.doh)
print(args.files)

上面的注释行通知解析器期望nargs ='*'位置参数的未定义数量 >= 0 ( )。

从命令行运行脚本会给出以下输出:

$ ./p.py --doh *.py
True
['p2.py', 'p.py']
$ ./p.py *.py
False
['p2.py', 'p.py']
$ ./p.py p.py
False
['p.py']
$ ./p.py 
False
[]

观察文件将如何出现在列表中,无论它们是多个还是只有一个。

于 2011-12-07T23:18:51.147 回答
1

或者,您可以通过以下方式同时使用两者:

import sys
import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("-v", "--verbose", help="increase verbosity", action="store_true")
    args, unknown = parser.parse_known_args()
    for file in sys.argv:
        if not file.startswith("-"):
            print(file)

但是,这仅适用于独立参数,否则参数值将被视为文件参数(除非您不会用空格分隔它们,或者您将进一步改进代码)。

于 2015-05-01T20:00:48.753 回答