在Python中结合使用argparse和sys.argv

7 投票
2 回答
10615 浏览
提问于 2025-04-17 07:56

我现在有一个脚本,它通过 sys.argv 这个变量来处理文件,像这样:

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

这个方法在处理一堆文件时效果很好;不过,我想把它和 argparse 模块一起使用。所以,我希望我的程序能够处理类似下面这样的情况:

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

有没有人尝试过这样做,或者有什么建议可以让我继续进行?

2 个回答

2

另外,你可以用以下方式同时使用这两者:

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)

不过,这种方法只适用于独立的参数。如果参数值没有用空格分开,或者你没有进一步改进代码,它们会被当作文件参数来处理。

18

如果我理解得没错,你的问题是关于如何把一组文件和一些标志或可选参数一起传递给命令。如果我理解正确的话,你只需要利用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)

上面注释的那一行告诉解析器,期待接收一个数量不定(大于等于0个)的参数(nargs ='*')。

从命令行运行这个脚本会得到以下输出:

$ ./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
[]

注意,无论文件有多少个,都会以列表的形式呈现,即使只有一个文件。

希望这对你有帮助!

撰写回答