【发布时间】:2014-11-04 07:22:02
【问题描述】:
我有一个脚本,它使用一个名为 config.py 的配置文件。实际上,这是一个配置模块。无论如何:配置模块包含很多参数和字典以及字典列表等。
在今天的脚本中是这样使用的
import config
def main():
myParameter = config.myParameter
现在我有这个脚本的另一个应用场景,它使用了相关的配置('config_advanced.py',但是参数和字典有不同的值。
我现在的目标是,选择使用的配置模块的名称作为传递的命令行参数:
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')
【问题讨论】:
-
必须是python吗?使用 Json/yaml/ini 会更容易(也更安全)。
-
您可以使用内置的
__import__()函数按名称导入模块并将结果命名为config。 -
非常感谢。有效!我必须先附加配置文件的路径。或者还有其他方法吗?这是我的解决方案:
import sysfullpath = "d:\\python\\scripts\\projectA\\configurationFiles\\"sys.path.append(fullpath)config = __import__('config_advanced') -
抱歉格式错误。根据帮助两个空格应该添加一个换行符:“用两个空格结束一行以添加一个
换行符”。但我想,我在这里做错了 -
cmets 中的代码很难阅读,而且无法正确缩进,所以请将其编辑到您的问题中。 cmets 中的代码应仅限于微小的片段。
标签: python configuration arguments