在python 3中传递系统属性的有效方法

时间:2016-07-23 09:27:23

标签: python python-2.7 python-3.x

我正在使用python 3作为应用程序。对于该实用程序,我需要传递命令行参数,如下所示,

python3 -m com.xxx.executor -Denvironment=dev -Dtoggle=False 

参数environmenttoggle也都存在于属性文件中。如果在命令行中指定了值,则它应该覆盖属性文件中的内容。

我基本上是一个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老手,请指导!

2 个答案:

答案 0 :(得分:0)

对于参数解析,我使用argparse模块(docs)来定义哪些是有效的命名和/或位置参数。

还有第三方模块,例如clickdocopt。您应该使用自己最满意的内容以及是否可以使用第三方模块。点击文档包含它(argparse和docopt。)之间的(可能是有偏见的)比较。

我从未使用sys._xoptions,也不知道它的存在。似乎有点奇怪的是,在文档中提到了以underscore开头的函数(通常用于表示“私有”函数)。也许其他人可以对此有所了解。

对于解析属性文件,我使用configparser模块(docs)。当然,如果您愿意,可以选择JSON或YAML配置文件。

也就是说,当指定为参数时,你必须提出必要的代码来否决属性(虽然这不应该太难)。

答案 1 :(得分:0)

来自the docs on -X args

  

保留用于各种特定于实现的选项。 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模块。