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

now*_*wox 5 python module python-import

我有这个结构:

.
??? module
    ??? __init__.py
    ??? submodule
        ??? __init__.py
        ??? foo.py
        ??? bar.py
Run Code Online (Sandbox Code Playgroud)

module.submodule.__init__.py我有这样的:

import foo
import bar
Run Code Online (Sandbox Code Playgroud)

module.submodule.foo.py我有这样的:

import very_heavy_third_party_module as vhtpm
...
Run Code Online (Sandbox Code Playgroud)

我想进口bar而已,但我得到减缓foo(让我们想象有一个丑陋的time.sleep(3)两个foomodule/__init__.py).

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

from module.submodule.bar import saybar
saybar()
Run Code Online (Sandbox Code Playgroud)

我怎样才能导入saybar位于我的子模块中bar

Noa*_*oah 3

bar在不运行的情况下导入 from 的唯一方法foo是删除import foofrom module.submodule.__init__.py__init__.py这是因为当您在 Python 中导入包/模块时,该模块(或者如果导入包)中的所有顶级代码都会运行。当您运行时from module.submodule.bar import saybar,所有顶级代码都位于:

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

正在运行。由于module.submodule.__init__.pycontains import foo,foo被导入并且它的所有顶级代码(包括import very_heavy_third_party_module as vhtpm)也被运行,导致速度减慢。

一些可能的解决方案是:

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