【问题标题】:Problem with python and __import__python和__import__的问题
【发布时间】:2009-08-27 16:12:05
【问题描述】:

对不起,通用标题,一旦我了解我的问题的根源,就会改变它 我有以下结构:

foo/
foo/__init__.py
foo/bar/
foo/bar/__init__.py
foo/bar/some_module.py

当我尝试通过这样做导入 some_module 时:

from foo.bar import some_module

它就像一个魅力。 但这对我没有好处,因为我只知道要在运行时导入的模块的名称。所以如果我尝试:

from foo.bar import *
mod=__import__('some_module')

我得到一个错误。难道我做错了什么?有一个更好的方法吗?为什么会这样?

这是为什么呢?我不太确定我是否完全理解 python 包背后的概念。我认为它们等同于 java 的包,因此

【问题讨论】:

  • 错误信息是什么意思?
  • 您的some_module 已导入!

标签: python import


【解决方案1】:

我认为正确的做法是:

mod = __import__('foo.bar', fromlist = ['some_module'])

这样,即使是 'foo.bar' 部分也可以在运行时更改。 因此,some_module 将作为mod.some_module 提供;如果你想在一个单独的变量中使用 getattr:

the_module = getattr(mod, 'some_module')

【讨论】:

    【解决方案2】:
    from foo.bar import *
    

    是一种不好的做法,因为它将some_module 导入到全局范围内。

    您应该能够通过以下方式访问您的模块:

    import foo.bar
    mod = getattr(foo.bar, 'some_module')
    

    可以很容易地证明这种方法有效:

    >>> import os.path
    >>> getattr(os.path, 'basename')
    <function basename at 0x00BBA468>
    >>> getattr(os.path, 'basename\n')
    Traceback (most recent call last):
      File "<pyshell#31>", line 1, in <module>
        getattr(os.path, 'basename\n')
    AttributeError: 'module' object has no attribute 'basename
    '
    

    附:如果您仍然对使用您的 import 语句感兴趣。你需要一个eval:

    from foo.bar import *
    eval('some_module')
    

    澄清一下:使用*-import 不仅是不好的做法,而且与eval 结合使用甚至更糟糕。所以只需使用getattr,它就是专为像您这样的情况而设计的。

    【讨论】:

    • -1 用于推荐 eval()。如果您只想从全局范围内查找值,请始终使用 globals()['some_module']。
    • 好的,再次 +1 以供您澄清。 getattr() 是这里的正确答案。如果您需要使用 __import__(),请参阅 kurczak 的回答。
    • 呃哦,现在我得到“投票太旧无法更改,除非编辑此答案”。抱歉——我在代码块中看到了 eval() 并自动点击了 -1。
    • 对不起,这似乎不起作用......这样做会引发错误:'module' object has no attribute 'some_module'(不知道为什么它将 foo.bar 称为模块.. .)
    • 它工作得很好,它只是意味着foo.bar 没有属性some_module。你的名字是从哪里来的?
    【解决方案3】:

    来自docs

    直接使用__import__() 的情况很少见,除非您要导入名称仅在运行时知道的模块。

    但是,点符号应该可以工作:

    mod = __import__('foo.bar.some_module')
    

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多