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语言:-)