我有不同的配置文件,它们基本上是定义变量的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)可能具有另一组参数,因此我希望能够通过加载所需的配置文件来选择要运行的实验。
答案 0 :(得分:3)
如果您真的要这样做,可以使用importlib模块:
import importlib
params = importlib.import_module(sys.argv[1])
然后您可以像这样使用var
params.var1
答案 1 :(得分:1)
这是针对您的详细信息而不是问题。
如果您想从文件中加载num_iterations = 100
,initial_value1 = 10
,initial_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")