如何将 optparse() 代码升级为 argparse() 代码
Posted
技术标签:
【中文标题】如何将 optparse() 代码升级为 argparse() 代码【英文标题】:How to upgrade optparse() code to argparse() code 【发布时间】:2015-06-02 22:03:08 【问题描述】:我正在尝试从现已弃用的 optparse
模块升级到新的 argparse
模块。但是我在升级我的代码时遇到了一些麻烦。我一直在使用 pythons 文档来做这件事,但我似乎碰壁了。
这是使用optparse
模块的原始sn-p代码
if __name__ == "__main__":
parser = optparse.OptionParser(usage="%prog [options] hostname")
parser.add_option("-p","--port", dest="port",
help="Port to use for socket connection [default: %default]",
default=33434, metavar="PORT")
parser.add_option("-m", "--max-hops", dest="max_hops",
help="Max hops before giving up [default: %default]",
default=30, metavar="MAXHOPS")
(options, args) = parser.parse_args()
if len(args) != 1:
parser.error('Incorrect number of arguments')
else:
dest_name = args[0]
sys.exit(main(dest_name=dest_name,
port=int(options.port),
max_hops=int(options.max_hops)))
现在这是我能够做的部分升级代码
if __name__ == "__main__":
parser = argparse.ArgumentParser(usage="%(prog)s [options] hostname")
parser.add_argument("-p","--port", dest="port",
help="Port to use for socket connection [default: %(default)s]",
default=33434, metavar="PORT")
parser.add_argument("-m", "--max-hops", dest="max_hops",
help="Max hops before giving up [default: %(default)s]",
default=30, metavar="MAXHOPS")
args = parser.parse_args()
if len(sys.argv) != 1:
parser.error('Incorrect number of arguments')
else:
dest_name = sys.argv
sys.exit(main(dest_name=dest_name,
port=int(options.port),
max_hops=int(options.max_hops)))
当我尝试运行代码时,我不断收到此错误:
*port=int(options.port),
NameError: name 'options' is not defined*
在我在这里定义的 optparse() 模块中
(options, args) = parser.parse_args()
当我尝试以与 optparse
模块相同的方式定义它时,它给了我另一个错误:
*TypeError: 'Namespace' object is not iterable*
(我知道argparse
模块中的(options, args) = parser.parse_args()
已更改为args = parser.parse_args()
。我只是在四处寻找解决方案。此时我绝望了)
最后,我尝试将port=int(options.port)
中的“选项”更改为port=int(args.port)
,这给了我更多错误。阅读有关将optparse
升级到argparse
的文档后,我想我可能知道我的问题出在哪里。文档说明
“将选项 args = parser.parse_args() 替换为 args = parser.parse_args() 并为位置参数添加额外的 add_argument() 调用。”
所以我认为我的问题是我没有为位置参数添加额外的 add_argument() 调用。由于我是新手并且仍在尝试学习 python 解析模块,所以我不知道如何去完成它。
【问题讨论】:
您的 argparseargs
替换了 optparse 代码中的 options
和 args
。解析器可以将 dest_name
参数直接作为“位置”参数处理。
【参考方案1】:
摆脱这个optparse
废话:
if len(sys.argv) != 1:
parser.error('Incorrect number of arguments')
else:
dest_name = sys.argv
并添加一个位置参数
parser.add_argument('hostname')
...
dest_name = args.hostname
【讨论】:
以上是关于如何将 optparse() 代码升级为 argparse() 代码的主要内容,如果未能解决你的问题,请参考以下文章