如何在Python中单独导入子模块?

时间:2016-11-02 14:39:31

标签: python module python-import

我有这个结构:

.
└── module
    ├── __init__.py
    └── submodule
        ├── __init__.py
        ├── foo.py
        └── bar.py

module.submodule.__init__.py我有这个:

import foo
import bar

module.submodule.foo.py我有这个:

import very_heavy_third_party_module as vhtpm
...

我只想导入bar,但我被foo放慢了速度(让我们假设time.sleep(3)和{{1}都有一个丑陋的foo })。

所以我的目标是在下面写这个,而不会被模块的其他部分放慢速度:

module/__init__.py

如何导入位于子模块from module.submodule.bar import saybar saybar() 中的saybar

1 个答案:

答案 0 :(得分:3)

bar导入而不运行foo的唯一方法是从import foo删除module.submodule.__init__.py。这是因为当您在Python中导入包/模块时,将运行该模块中的所有顶级代码(如果导入包,则为__init__.py)。当您运行from module.submodule.bar import saybar时,所有顶级代码都在:

  • module.__init__.py
  • module.submodule.__init__.py
  • module.submodule.bar.py

正在运行。由于module.submodule.__init__.py包含import foo,因此会导入foo,并且所有顶级代码(包括import very_heavy_third_party_module as vhtpm)都会运行,从而导致速度减慢。

一些可能的解决方案是:

  • __init__.py移出尽可能多的代码。将__init__.py留空是常见的做法 - 如果有一些功能,您可能需要考虑将其移动到自己的模块。一旦import行是唯一剩余的行,您就可以删除它们,因为它们在命名空间方面没有任何区别。
  • import vhtpm中的foo.py从顶层向下重新定位(例如,转换为模块中其他内容调用的函数)。这不是很干净,但如果您需要优化,可能对您有用。