当前位置: 首页 > 面试题库 >

Python:如何从模块动态导入所有方法和属性

子车勇锐
2023-03-14
问题内容

我想动态加载模块,给定它的字符串名(来自环境变量)。我正在使用Python 2.7。我知道我可以做类似的事情:

import os, importlib
my_module = importlib.import_module(os.environ.get('SETTINGS_MODULE'))

这大致相当于

import my_settings

(其中SETTINGS_MODULE = 'my_settings')。问题是,我需要相当于

from my_settings import *

因为我希望能够访问模块中的所有方法和变量。我试过了

import os, importlib
my_module = importlib.import_module(os.environ.get('SETTINGS_MODULE'))
from my_module import *

但是这样做会导致很多错误。有没有一种方法可以在Python 2.7中动态导入模块的所有方法和属性?


问题答案:

如果您有模块对象,则可以模仿逻辑import *用法,如下所示:

module_dict = my_module.__dict__
try:
    to_import = my_module.__all__
except AttributeError:
    to_import = [name for name in module_dict if not name.startswith('_')]
globals().update({name: module_dict[name] for name in to_import})

但是,这几乎肯定是一个非常糟糕的主意。您将毫不客气地踩着任何具有相同名称的现有变量。当您from blah import *正常执行此操作时,这已经够糟糕的了,但是当您动态执行此操作时,关于哪些名称可能会冲突的不确定性更大。最好只是导入my_module,然后使用常规属性访问(例如my_module.someAttrgetattr从中访问所需的内容,或者如果需要动态访问其属性,则更好。



 类似资料:
  • 问题内容: 我有一台受信任的远程服务器,其中存储了许多自定义Python模块。我可以通过HTTP(例如,使用)作为文本/纯文本来获取它们,但是我无法将获取的模块代码保存到本地硬盘上。如何将代码作为完全可操作的Python模块(包括其全局变量和导入)导入? 我想我必须使用和模块功能的某种组合,但是我还无法使其工作。 问题答案: 看起来这应该可以解决问题:导入动态生成的模块 另外,按照ActiveSt

  • 问题内容: 目录结构: module1.py: 我如何才能将所有模块从模块添加到主类而没有前缀(即像foo = fooBar()一样使用它们,而不是foo = my_modules.module1.fooBar())。 一个明显的决定是在main.py中编写如下内容: 但是我不想在创建新的moduleN时更改main.py。有解决方案吗? 我确实知道导入这样的类不是一个好主意,但是我对此仍然很好奇

  • 问题内容: 我的目录结构如下: 从导入模块。我尝试结合使用with ,但是使用该方法,我只能在using下直接导入所有子模块。我想让他们全都陷入困境。导入的所有子模块的最干净的方法是什么,以便可以从中访问? 编辑:对不起,我有点含糊。我想在运行时导入子模块,而不在中明确指定它们。我可以用来获取子模块名称(除非有人知道更好的方法),但是我不确定使用这些名称(或者返回的ImpImporters ?)导

  • 我有多个文件的结构像一个文件: 我需要能够在不同的python文件中从“example.py”动态导入方法,如: 由于多种原因,我不能改变的结构,所以我需要建立一个机制来加载方法并评估它们。我试图使用,但它只能导入一个类,而不是只定义了方法的文件。谢谢你的帮助。

  • 16.6. 动态导入模块 好了,大道理谈够了。让我们谈谈动态倒入数据吧。 首先,让我们看一看正常的导入模块。 import module 语法查看搜索路径寻找已命名模块并以名字导入它们。你甚至于可以以这种方法,以逗号分割同时导入多个模块,本章代码前几行就是这样做的。 例 16.13. 同时导入多个模块 import sys, os, re, unittest 这里同时导入四个模块:sys (

  • 我有一个这样的目录: 我可以这样导入父模块: 那么,既然我已经有了父模块,那么获取子模块的最佳方法是什么?我已经尝试了,,等。 有什么建议吗? 谢谢