【问题标题】:Dynamic import in PythonPython中的动态导入
【发布时间】:2012-01-10 06:56:55
【问题描述】:

如何进行此导入:

from module import *

带有imp 模块?

免责声明:

  • 我需要使用imp 模块,因为我需要做几个声明并且我想动态地做它
  • 我需要使用*,因为我需要在我进行导入的文件中,module 中定义的变量和方法直接可用,我的意思是without module.methodmodule.variable。并且我想导入模块中的所有变量和方法,因为我不知道将来模块中可以有哪些方法或变量

【问题讨论】:

  • 所以一旦你从这个神秘的模块中导入所有东西,你不知道它包含什么,你打算用它做什么? ;-)
  • 我正在尝试将 django settings.py 拆分为多个文件
  • 我可以推荐这个吗? justcramer.com/2011/01/13/settings-in-django
  • 当然可以,但我正在尝试一些不同的东西

标签: python dynamic import module


【解决方案1】:

这里!

def load_everything_from(module_names):
    g = globals()
    for module_name in module_names:
        m = __import__(module_name)
        names = getattr(m, '__all__', None)
        if names is None:
            names = [name for name in dir(m) if not name.startswith('_')]
        for name in names:
            g[name] = getattr(m, name)

我有点编造一些事情,首先尝试找到一个__all__ 符号,然后,如果该文件,做一个dir() 并抓取看起来非私有的符号 - 你必须看看在import * 的实现中了解它是否与 Python 的实际逻辑足够接近以满足您的目的。

【讨论】:

  • 很有趣,但你不就是对多个模块名称同时执行from module_name import * 并跳过所有名称以“_”开头的元素的魔鬼倡导者吗?此外,dir() 的主要目的是交互式提示,他们在文档中提到其行为可能因版本而异。但确实很有趣;)
【解决方案2】:

如果您使用的是 django(如 cmets 中所述),则应该可以使用类似的方法

from django.utils import importlib
my_module = importlib.import_module('app.my_module')
from my_module import *

但我同意这可能很危险

【讨论】:

  • from 语法不适用于您的本地 my_module。您将得到“my_module 未定义”。 import_module 类似于“from foo import bar”,因此很遗憾通配符导入不起作用
【解决方案3】:

你可以这样做:

from imp import *

但请记住:

显式优于隐式。

(来自 Python 之禅 - 使用以下命令阅读:import this

【讨论】:

  • 但我需要使用 imp 模块,因为我需要多次导入
  • @diegueus9:我完全不理解你在说什么。您可以在不同的位置执行import imp(第一次导入imp 模块后,每个import imp 语句都将被忽略),您甚至可以使用reload(imp) 重新导入模块。 “因为我需要多次导入”并不是导入所有内容的原因,我相信它甚至不相关。
  • 抱歉,我认为是我的英语不好,但在免责声明中我试图解释为什么 from imp import * 对我不起作用
  • @diegueus9:是关于根据你拥有的字符串加载模块吗?例如。你想要import_my_module(name_of_the_module) 之类的东西,而不是在代码中任何你喜欢的地方调用import imp
  • 是的,是的。此外,我需要模拟 from module import * 并且我有一个带有字符串的模块列表
猜你喜欢
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2011-04-17
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多