Python:从已导入的模块导入函数

Python: import function from an already imported module

假设我有一个 python 包 my_package,其中包含一个模块 my_module,其中包含一个函数 my_function

我试图在 python 交互式 shell 中执行以下导入:

>>> from my_package import my_module
>>> my_module.my_function()            # => OK
>>> from my_module import my_function  # => ImportError: No module named my_module
>>> from my_package.my_module import my_function   # => OK

我对上面第三行的ImportError感到很惊讶:既然my_module已经导入了,为什么我不能从它导入一个函数呢?也许我对 python 导入系统的工作原理有一些误解,非常感谢任何澄清!


这是目录结构和源代码。

my_package
  |- __init__.py
  |- my_module.py

这是 __init__.py 文件

all = ["my_module"]

这是 my_module.py 文件

def my_function():
    pass

Python 导入系统不能那样工作。当您执行 from foo import bar 时,foo 必须是 "real",完全限定的包或模块名称(或使用点的相关名称)。也就是说,它必须是您可以在普通 import foo 中使用的东西。它不能只是你身边的一个模块对象。例如,你也不能这样做:

import foo as bar
from bar import someFunction

the documentation 中对此进行了说明,但您必须通读该部分才能了解全貌。它说:

Import statements are executed in two steps: (1) find a module, and initialize it if necessary; (2) define a name or names in the local namespace (of the scope where the import statement occurs). The statement comes in two forms differing on whether it uses the from keyword. The first form (without from) repeats these steps for each identifier in the list. The form with from performs step (1) once, and then performs step (2) repeatedly.

步骤 (1) 是 "finding the module",如果您继续阅读,您会发现这是它在 sys.modulessys.path 等中看起来的过程。没有它在导入名称空间中查找恰好具有模块对象作为其值的名称的点。请注意,这两种导入的模块查找过程没有什么不同;当您执行 import foo 时它找到 foo 的方式与您执行 from foo import bar 时它找到它的方式相同。如果普通的 import my_module 不起作用(如您的示例所示),那么 from my_module import stuff 也不起作用。

请注意,如果您已经导入了模块,并且只想为其中的函数取一个更短的名称,您可以只为该函数分配一个常规变量:

from my_package import my_module
myfunc = my_module.my_function