从变量导入模块

时间:2018-11-28 14:28:01

标签: python

我有不同的配置文件,它们基本上是定义变量的python文件,我想将其导入主程序中。

通常,我将拥有一个“ config_file1.py”并执行类似的操作:

import config_file1 as params

# and then I can access the different parameters as
params.var1
params.var2

现在,我希望能够选择我要使用的config_file,因此我想在调用程序时传递一个参数,以告知要使用的配置文件。像这样:

config_filename = sys.argv[1]
import config_filename as params

但是,这会查找名为“ config_filename”的文件。

我想导入由config_filename值引用的文件

编辑:

基本上,我的程序将运行一组实验,而这些实验需要一组参数才能运行。

例如:

*** config1.py ****
num_iterations = 100
initial_value1 = 10
initial_value2 = 20 

所以我可以运行我的程序,将这些变量加载到内存中。

但是另一个配置文件(config2.py)可能具有另一组参数,因此我希望能够通过加载所需的配置文件来选择要运行的实验。

5 个答案:

答案 0 :(得分:3)

如果您真的要这样做,可以使用importlib模块:

import importlib
params = importlib.import_module(sys.argv[1])

然后您可以像这样使用var

params.var1

答案 1 :(得分:1)

这是针对您的详细信息而不是问题。

如果您想从文件中加载num_iterations = 100initial_value1 = 10initial_value2 = 20之类的变量,那么我真的建议您使用某种配置,而不是滥用全局变量的导入。

Json是最简单的方法,您可以在其中加载文件,然后直接得到字典:

>>> import json
>>> params = json.loads(config_file1)
{'num_iterations': 100, 'initial_value1': 10, 'initial_value2': 20}

或者,您可以使用ConfigParser,它看起来更好,但是我发现它很容易损坏。

答案 2 :(得分:0)

您可以使用import函数,而不是使用__import__语句,如下所示:

params = __import__('module_name')

定义:

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)

参考: https://docs.python.org/3/library/importlib.html#importlib.import

答案 3 :(得分:0)

您可以这样做:

config_filename = sys.argv[1]
params = __import__(config_filename)

答案 4 :(得分:0)

我不建议使用这种冒险的方法。您放弃了sys.argv处的所有控件,并且如果模块中不存在任何named属性,则脚本可能会失败。

相反,我建议明确控制传入的支持模块是什么:

config_filename = sys.argv[1].lower()

if config_filename == 'os':
    import os as params
elif config_filename == 'shutil':
    import shutil as params
else:   # unhandled modules
    raise ImportError("Unknown module")