【发布时间】:2019-02-04 18:43:33
【问题描述】:
我正在尝试编写一个可以在命令行中控制的守护程序服务。比如启动服务
python3 test.py -c start -d /mydownloadfolder/ -j /myconfig.json
停止服务,
python3 test.py -c stop
-d-j参数只有在我启动服务时才需要。因此,我需要根据另一个参数的值来实现有条件需要的参数。
我做了一些搜索,发现这篇有用的帖子Python Argparse conditionally required arguments 不同之处在于:我需要检查“--command”的值,而不是检查“--command”的存在。
这是我的暂定解决方案:
PARSER.add_argument('-c', '--command', required=True, help='provide a valid command: start, stop, restart, or status')
NEED_MORE_ARGS = PARSER.parse_args().command.lower().startswith('start')
PARSER.add_argument('-d', '--download', required=NEED_MORE_ARGS , default=LOCAL_DOWNLOAD, help='set account download folder')
PARSER.add_argument('-j', '--input', required=NEED_MORE_ARGS, default=JSON_INPUT, help='set input json file')
我解析了中间的args得到NEED_MORE_ARGS(boolean),然后添加其他的args。代码似乎不干净。有没有更好的方法来做到这一点?
==============
更新:暂定解决方案不起作用。 :(
【问题讨论】:
-
我认为该链接很好地涵盖了选项。
argparse中没有内置任何东西可以进行这种交叉检查。我更喜欢解析后测试选项。但也要考虑一下——你想提供什么样的help? -
我可能会补充一点,如果您不需要'-c' 标志,您可以使用子解析器机制。 'stop' 可以是一个不带任何附加参数的子解析器,'start' 一个带有 2 个必需参数的子解析器。
-
在您提到的链接中,最佳答案是关于查看 sys.argv。这对我来说很有意义。首先忘记 argparse,只需检查 -c 并在 argv 中停止或启动。然后根据您在 sys.argv 中找到的内容使用 argparse。或者干脆忘记 argparse 并自己处理 sys.argv。对我来说似乎更简单。