代码之家  ›  专栏  ›  技术社区  ›  Sembei Norimaki

从变量导入模块

  •  0
  • Sembei Norimaki  · 技术社区  · 7 年前

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

    通常我会有一个“config_file1.py”并做如下的事情:

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

    现在,我想能够选择要使用的配置文件,所以我想在调用程序时传递一个参数,告诉它要使用哪个配置文件。类似:

    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 回复  |  直到 7 年前
        1
  •  3
  •   Akarius    7 年前

    如果你 真正地 要执行此操作,可以使用importlib模块:

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

    然后您可以使用这样的var

    params.var1
    
        2
  •  1
  •   Peter    7 年前

    这是对你的细节的回应,而不是问题。

    如果要加载变量,例如 num_iterations = 100 , initial_value1 = 10 , initial_value2 = 20 从一个文件中,我真的会推荐一些配置,而不是滥用全局变量的导入。

    JSON是最简单的方法,您可以加载文件,然后直接得到一个dict:

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

    或者你也可以使用configparser,它看起来更好,但我发现它很容易崩溃。

        3
  •  0
  •   Pedro Borges    7 年前

    您可以这样做:

    config_filename = sys.argv[1]
    params = __import__(config_filename)
    
        4
  •  0
  •   r.ook jpp    7 年前

    我不推荐这种冒险的方法。你放弃了所有的控制权 sys.argv 如果模块中不存在任何一个命名属性,脚本可能会失败。

    相反,我建议显式控制传入的受支持模块是什么:

    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")
    
        5
  •  0
  •   grapes    7 年前

    而不是使用 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