如何将 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 解析模块,所以我不知道如何去完成它。

【问题讨论】:

您的 argparse args 替换了 optparse 代码中的 optionsargs。解析器可以将 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() 代码的主要内容,如果未能解决你的问题,请参考以下文章

怎么将可变参数的函数的参数传递给另一个可变参数的函数

optparse 到 argparse 的简单包装器?

struct&optparse模块

使用 optparse 调用函数

Python中optparse模块使用浅析

python 使用optparse的代码段示例