【问题标题】:How to import package modules from package's __init__.py?如何从包的 __init__.py 导入包模块?
【发布时间】:2013-07-29 13:10:40
【问题描述】:

我有一个要从__init__.py 导入的模块名称列表。

$ mkdir /tmp/pkg
$ touch /tmp/__init__.py /tmp/pkg/{a.py,b.py}
$ cat /tmp/pkg/__init__.py
to_import = ["a", "b"]

import importlib
for toi in to_import:
    importlib.import_module(toi)

$ cd /
$ python
>>> import tmp.pkg
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "tmp/pkg/__init__.py", line 5, in <module>
    importlib.import_module(toi)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named a
>>> 

python 2.7.4 Ubuntu 64 位

问题:那么如何从包的__init__.py 导入包模块?

【问题讨论】:

  • 好吧,我不明白。为什么不直接import a, b
  • 为简单起见,我将示例最小化。模块列表是动态的,可以在别处获得。

标签: python python-2.7 python-import


【解决方案1】:

您可以为此使用relative imports。尝试将/tmp/pkg/__init__.py 更改为以下内容:

to_import = [".a", ".b"]

import importlib
for toi in to_import:
    importlib.import_module(toi, __name__)

注意模块名称前的点和import_module 函数的第二个参数。

【讨论】:

  • ...或者只是按照语言的意图使用简单的导入语句。做一些简单的事情是一件超级复杂的事情。
  • ..但是主题启动器专门询问了如何从列表中导入所有模块。此外,使用import 语句,您仍然需要在这种情况下使用相对导入,例如from . import a, b
  • import a,b 是一个列表,它是从 __init__.py 文件导入的常规方式。你不需要“来自”。要么 ”。”任何事物。 “。”用于包模块之间的相对导入,但不用于 __init__.py 本身。
  • 确实,import a, b 在那里工作。几个小点:我相信从__init__.py 和其他包模块的相对导入之间没有区别;在 python 2.7 中,您可以使用这两种语法:带或不带点(除非有 from __future__ import absolute_import 语句);在 python 3 中不推荐使用不带点的相对导入。
  • 简洁优雅。谢谢基里尔!我是新的,我很接近 :)
【解决方案2】:

您必须在末尾添加 init

import tmp.pkg.__init__

导入文件应与 init.py 文件位于同一路径,否则它们将不起作用

FullPath/pkg/__init__.py

init.py 文件

to_import = ["__HistogramObjects__"]

import importlib
for toi in to_import:
    importlib.import_module(toi)

然后在您要从中导入的文件中

import FullPath.pkg.__init__ as im

for i in im.to_import:
    print i

你的输出应该是:

__HistogramObjects__

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 2012-11-25
    • 2013-04-21
    • 2021-11-08
    • 2015-07-30
    • 2019-05-29
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多