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

时间:2014-02-25 16:46:40

标签: 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.close()
    return hash().hexdigest()

### some code here

如您所见,我有机会使用不同的标志来允许我在从命令行调用脚本时更改哈希类型或块大小(例如./myscript.py -sha1 -b 512 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相同?虽然它确实使普通用户的工作更容易,但通常的做法是这样做吗?

I saw something similar but for C#. Python中有类似的概念吗? 事情是,就像这些事情一样简单,它们很快就会失控 - 至少对我来说。我最终弄得一团糟。你对这个问题有什么看法?

1 个答案:

答案 0 :(得分:3)

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

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