使用不同的配置文件 - 应通过命令行参数做出决定

时间:2014-11-04 07:22:03

标签: python configuration arguments

我有一个脚本,它使用名为config.py的配置文件。实际上这是一个配置模块。无论如何:配置模块包含很多参数和字典以及字典列表等。

在今天的剧本中,它就像这样使用

import config

def main(): 
    myParameter = config.myParameter

现在我有另一个使用相关配置的脚本的应用程序场景('config_advanced.py',但参数和词典有不同的值。

我的目标是,选择使用的config-modul的名称作为传递的命令行参数:

myScript.py -configuration config_advanced.py

由于配置模块与主脚本位于同一个文件夹中,我想我必须先将传递的配置文件重命名为'config.py'。之后我可以执行import config。否则,如果我使用`import config_advanced,我将无法使用像

这样的调用
config.myParameter

在主脚本中。

另一种可能性是,将配置模块放在子文件夹中并保留名称config.py。传递的命令行参数必须包含子文件夹。

无论哪种方式,我都无法在主文件的顶部执行导入,因为我必须先进行参数解析。这不是技术问题,但有人说这至少是不好的实践。

你怎么看? 没有太多努力,有什么更好的方法来做这个伎俩? 非常感谢


编辑:
一个有效的解决方案是

import sys fullpath = "d:\\python\\scripts\\projectA\\configurationFiles\\" 
sys.path.append(fullpath) 
config = __import__('config_advanced')


没有syspath它不起作用,因此以下尝试不起作用:

config = __import__('d:\\python\\scripts\\projectA\\configurationFiles\\config_advanced')
config = __import__('d:\\python\\scripts\\projectA\\configurationFiles\\config_advanced.py')

1 个答案:

答案 0 :(得分:0)

另一种可能与你在问题中建议的相似,但不需要你隐藏子文件夹中的东西,是将config_advanced.py和config_plain.py放在与主脚本相同的文件夹中,然后动态制作config.py指向要使用的实际配置文件的链接。

然而,马蒂诺的建议很多更简单。

OTOH,georg提出了一个非常有效的观点,尤其是,如果这个脚本不仅仅是供个人使用。虽然使用Python本身的配置数据是灵活和强大的,它可能有点强大。配置数据应该数据,而不是实时可执行代码。如果在修改配置数据时犯了一个小错误,如果它在可执行文件中,则可能会造成严重破坏。如果恶意用户接到它,它们可能造成的损害没有限制。

普通旧数据文件中的错误数据最不会导致ValueError,如果它做了一些奇怪的配置解析代码并不怀疑。但是实时Python文件中的错误数据可能会引发各种令人讨厌的错误。或者更糟糕的是,它可以完全沉默地做一些邪恶的事情......


在回复您的评论时,这里有一些代码来说明第一点:

#! /usr/bin/env python

import os

config_file = "config.py"

def link_config(mode):
    if os.path.exists(config_file):
        os.remove(config_file)

    config_name = "config_%s.py" % mode
    os.symlink(config_name, config_file)

#.... parse command line to determine config_mode string, then do
link_config(config_mode)

#Now import the newly-linked config file
import config

如果config_mode ==“plain”,上面的代码将导致config_plain.py导入为'config'

如果config_mode ==“advanced”,它将导致config_advanced.py导入为'config'

但正如我之前所说,马蒂诺的方法很多更简单。而IIRC,os.symlink可能不适用于非unix系统。

...

至于你的第二点,请查看the docs for the json module