【发布时间】: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 代码中的options和args。解析器可以将dest_name参数直接作为“位置”参数处理。