Python中处理sys参数的规范方法是什么?

Python中处理sys参数的规范方法是什么?,python,command-line-arguments,sys,Python,Command Line Arguments,Sys,假设我想制作一个哈希脚本: ### 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.clo

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

### 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-b512 some_file.ext
)。问题是,我不知道我应该如何做,以保持我的代码尽可能干净和可读。如何处理
sys.argv

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

我应该在
main()
中执行所有这些操作,还是应该将它们放在不同的函数中

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

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

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

Python中有类似的概念吗? 问题是,尽管这些事情很简单,但它们很快就会失控——至少对我来说是这样。我最后搞得一团糟。您解决此问题的方法是什么?

对于非常简单的用例,例如检查是否存在一个参数,您可以执行如下检查:

if '-v' in sys.argv: ...
这是一种快速而肮脏的检查参数的方法。但一旦您的项目变得更加严肃,您肯定需要使用参数解析库

还有一些是用来处理参数解析的:有一个现在已经被弃用的
getopt
(我不提供链接),最常见的是它包含在任何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-b
script-b-a
,这将是等效的。免费的话,你有
script-h
免费的!:-)

尽管如此,我的偏好现在已经结束了,imho,它更简单、更优雅,例如:

"""
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

@MartijnPieters-问题解决了@MartijnPieters已经完全涵盖了答案。我想补充一句:)谢谢你指出docopt。事实证明,我试图在不知道参数解析器存在的情况下处理所有这些问题。让我想知道还有多少东西需要学习。docopt的优点是,它使用相同的accross语言:-)