【发布时间】:2020-06-05 05:46:54
【问题描述】:
一天的好时光!首先,让我说我是 Python 世界的新手。我在解析输入参数时遇到问题。目前我正在使用 Python 2.7 和名为 argparse 的模块。我正在尝试设计能够解析简单输入参数的简单应用程序。这是一个简短的例子:
my_app.py 同步 --force
第二个例子:
my_app.py 补丁 --branch
我看到为此我可以使用add_argument,它可以使用位置参数和可选参数。就像我的情况一样,我希望很少有位置参数(但同时是可选的)和几个可选参数。
为此,我设计了小脚本
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='My App')
parser.add_argument('sync', type=bool, const=True, nargs='?')
parser.add_argument('-f', '--force', dest='sync_force', type=bool, const=True, nargs='?')
parser.add_argument('-b', '--branch', type=str, const=True, nargs='?')
parser.add_argument('-u', '--url', type=str, const=True, nargs='?')
parser.add_argument('patch', type=bool, const=True, nargs='?')
parser.add_argument('revert', type=bool, const=True, nargs='?')
parser.add_argument('verify', type=bool, const=True, nargs='?')
values = parser.parse_args()
if values.revert:
handler.revert()
else:
parser.print_help()
我看到我可以使用nargs='?' 将位置参数指定为可选,但是每次我调用我的脚本时,它都会显示我将'sync' 作为输入参数,甚至如果我指定了“补丁”。所以,我认为它只显示了第一个添加的元素。
你能告诉我哪里出了问题,哪里出了问题?
更新: 我正在尝试实现一种情况,即我将能够同时只有一个位置参数(并且至少有一个,但带有任何其他可选参数)。例如
my_app.py 同步
my_app.py 路径
my_app.py 验证 --force
my_app.pyrevert --branch
【问题讨论】:
-
我使用的是 Python 2.7 为什么?
-
你能提供更多关于参数使用选项的信息吗?例如,是否应该同时出现
sync、patch、revert、verify之一?尝试给出你的程序接受的所有不同选项。因为听起来您应该使用互斥组或子命令。很难推荐哪一个没有更多细节 -
将
patch/revert/verify替换为add_argument('cmd',choices=['patch', 'revert', 'verify']),解析后检查values.cmd。 -
type=bool是错误的。如果您想要真/假值,请使用action='store_true。nargs='?'有它的用途,但我认为它在任何这些用途中都没有用。const也一样。练习最简单的默认store和store_true操作。 -
除非您目前被雇用来维护 Python 2 代码,否则您应该切换到 Python 3。
标签: python python-2.7 parameter-passing command-line-arguments argparse