【问题标题】:What is the canonical way of handling sys arguments in Python?在 Python 中处理 sys 参数的规范方法是什么?
【发布时间】:2014-03-28 01:28:51
【问题描述】:

假设我想制作一个哈希脚本:

### some code here

def hashlib_based(path, htype='md5', block_size=2**16):
    hash = eval(htype)
    with open(path, 'rb') as f:
        for block in iter(lambda: f.read(block_size), ''):
            hash().update(block)
        f.close()
    return hash().hexdigest()

### some code here

如您所见,当我从命令行调用脚本时(例如./myscript.py -sha1 -b 512 some_file.ext),我有机会使用不同的标志来更改哈希类型或块大小。问题是,我不知道我应该如何做到这一点,以保持我的代码尽可能干净和可读。 sys.argv怎么处理?

首先,我如何检查用户是否使用了正确的标志?我需要这样做才能打印出 usage 消息。我是否列出了所有标志的列表,然后检查用户是否使用该列表中的标志?

我应该在 main() 中做所有这些事情还是应该将它们放在不同的函数中?

我应该在标志前面加上连字符减号(例如:-a、-b)还是不加连字符?要检查 sys.argv 中是否存在某个标志,我是否只需执行以下操作:

if '-v' in sys.argv:
    verbose = True

?

因为 sys.argv 有索引,忽略标志顺序的最佳方法是什么 - 或者换句话说,./myscript.py -a -b 是否应该与./myscript.py -b -a 相同?虽然它确实使普通用户的工作更容易,但这样做是常见的做法吗?

I saw something similar but for C#.Python中有没有类似的概念? 问题是,尽管这些事情很简单,但它们很快就会失控——至少对我来说是这样。我最终搞得一团糟。您对这个问题的处理方法是什么?

【问题讨论】:

标签: python command-line-arguments sys


【解决方案1】:

对于非常简单的用例,例如检查一个参数是否存在,您可以像显示的那样进行检查,即:

if '-v' in sys.argv: ...

这是检查参数的快捷方式。但是一旦你的项目变得更严肃了,你肯定需要使用参数解析库。

还有一些处理参数解析的方法:有现在已弃用的getopt(我不会给出链接),最常见的是argparse,它包含在任何python 发行版中。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', '--a-long', help='a help')
parser.add_argument('-b', '--b-long', help='b help')
args = parser.parse_args()

然后您可以致电您的script -a -bscript -b -a,这将是等效的。而且,您还可以免费获得script -h! :-)

不过,我现在更喜欢 docopt,恕我直言,对于同一个示例,它更简单、更优雅:

"""
My script.

usage:
    myscript -a | --along
    myscript -b | --blong

Options:
  -a --along     a help
  -b --blong     b help
"""

from docopt import docopt
arguments = docopt(__doc__, version='myscript 1.0')
print(arguments)

HTH

【讨论】:

  • 感谢您指出 docopt。结果我试图在不知道参数解析器存在的情况下处理所有这些问题。让我想知道还有多少东西要学。
  • docopt 的好处在于它在跨语言中的工作方式相同 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2010-09-14
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多