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

时间:2015-01-07 23:03:39

标签: python import importerror python-import

假设我有一个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

1 个答案:

答案 0 :(得分:2)

Python导入系统并没有这样做。执行from foo import bar时,foo必须是"真正的",完全限定的包或模块名称(或使用点的相对名称)。也就是说,它必须是您可以在普通import foo中使用的东西。它不仅仅是你所处的模块对象。例如,你也不能这样做:

import foo as bar
from bar import someFunction

这在the documentation中有说明,但您必须仔细阅读该部分才能全面了解情况。它说:

  

导入语句分两步执行:(1)找到一个模块,并在必要时进行初始化; (2)在本地名称空间(发生import语句的作用域)中定义一个或多个名称。该声明有两种形式,它们是否使用from关键字。第一种形式(没有from)为列表中的每个标识符重复这些步骤。带from的表单执行一次步骤(1),然后重复执行步骤(2)。

步骤(1)是"找到模块",如果您继续阅读,您会看到这是在sys.modulessys.path等处查看的过程。它没有必要在导入命名空间中查找恰好具有模块对象作为其值的名称。请注意,两种导入的模块查找过程没有区别; {for} foo import foo的执行方式与执行from foo import bar时的查找方式相同。如果普通import my_module不起作用(如您的示例所示),则from my_module import stuff也无法正常工作。

请注意,如果您已导入模块并且只想在其中使用较短的名称,则只需为该函数指定一个常规变量:

from my_package import my_module
myfunc = my_module.my_function