【问题标题】:Using argparse in conjunction with sys.argv in Python在 Python 中将 argparse 与 sys.argv 结合使用
【发布时间】:2012-01-15 11:17:52
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: python command-line-arguments glob argparse


【解决方案1】:

如果我理解正确,您的问题是关于将文件列表连同一些标志或可选参数一起传递给命令。如果我说得对,那么您只需要利用 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
[]

观察文件在列表中的排列方式,无论它们是多个还是一个。

HTH!

【讨论】:

  • 正是我想要的!谢谢!
  • 如果不是一面旗帜,你会如何做同样的事情?我有parser.add_argument('-b', '--blacklist', nargs='*',我想将 *.mp3 从 shell 传递到程序中。另外os.walk中使用了黑名单,所以实际的mp3文件不会在工作目录中。
  • @p014k - 我不确定我有没有收到你的问题。您是否要使用星号 [*] 通配符传递文件列表,但不让 shell 为您进行扩展?如果是这种情况,您必须引用参数:./p.py --doh '*.py'。在p.py 脚本中,您必须使用fnmatch 为您进行扩展。还是我误会了你?
  • 传入黑名单的参数是一个集合。然后将这个集合用于以下方式:os.walk 内的for filename in [f for f in filenames if f not in blacklist]: 我希望能够将 *.mp3 传递到 -b 并在该 for 循环中忽略所有 mp3 文件。
  • @p014k - 在我看来,您的问题是一个单独的、无关的问题,与如何从os.walk 循环中排除 mp3 文件有关(或者我是否又误解了你?)。根据我从您上面的评论中得到的信息,我只需在os.walk 返回的列表中使用内置函数filter。 filter(lambda fn: fn[-3:] != 'mp3', list_of_files) 之类的东西(未经测试)。 HTH,但如果没有,你最好打开自己的问题! :)
【解决方案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)

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

【讨论】:

    猜你喜欢
    • 2020-08-06
    • 2016-05-23
    • 2016-12-15
    • 2012-08-31
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2019-07-03
    • 2015-03-11
    相关资源
    最近更新 更多