我正在使用python 3作为应用程序。对于该实用程序,我需要传递命令行参数,如下所示,
python3 -m com.xxx.executor -Denvironment=dev -Dtoggle=False
参数environment
和toggle
也都存在于属性文件中。如果在命令行中指定了值,则它应该覆盖属性文件中的内容。
我基本上是一个java人,在java中,以-Dkey=value
形式传递的属性将被设置为系统属性。然后,这些属性可以从代码中读取为System.getProperty(key, defaultVal)
。
但是当我在python 3中尝试相同的时候,它没有用。
在引用python文档后,我觉得sys._xoptions适合我的要求。
python3 -Xenvironment=dev -Xtoggle=False -m com.xxx.executor
然后使用sys._xoptions
我正在使用Cpython。该主题的目的是确保我正在进行的方式是正确与否。或者是否有任何其他更好的方法在python中实现相同的。
Python老手,请指导!
答案 0 :(得分:0)
对于参数解析,我使用argparse
模块(docs)来定义哪些是有效的命名和/或位置参数。
还有第三方模块,例如click和docopt。您应该使用自己最满意的内容以及是否可以使用第三方模块。点击文档包含它(argparse和docopt。)之间的(可能是有偏见的)比较。
我从未使用sys._xoptions
,也不知道它的存在。似乎有点奇怪的是,在文档中提到了以underscore开头的函数(通常用于表示“私有”函数)。也许其他人可以对此有所了解。
对于解析属性文件,我使用configparser
模块(docs)。当然,如果您愿意,可以选择JSON或YAML配置文件。
也就是说,当指定为参数时,你必须提出必要的代码来否决属性(虽然这不应该太难)。
答案 1 :(得分:0)
保留用于各种特定于实现的选项。 CPython目前定义了以下可能的值:
这意味着您可能不应该为了自己的目的而劫持这些。正如Kristof所说,argparse是一个非常合理的选择。既然你想要一个文件和命令行参数,这里是一个使用json
基于文件的配置的简单示例:
import json
import argparse
argparser = argparse.ArgumentParser()
argparser.add_argument('--environment')
argparser.add_argument('--toggle', action='store_true')
try:
with open('config.json') as f:
args = json.load(f)
except (IOError, ValueError) as e:
# If the file doesn't exist or has invalid JSON
args = {}
args.update(vars(argparser.parse_args()))
print(args)
基于文件的配置还有其他可能的替代方案,例如configparser模块。