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

Python:从已导入的模块导入函数,python,import,importerror,python-import,Python,Import,Importerror,Python Import,假设我有一个python包myu包,其中包含一个模块myu模块,该模块包含一个函数myu函数 我试图在python交互式shell中执行以下导入: >>> from my_package import my_module >>> my_module.my_function() # => OK >>> from my_module import my_function # => ImportError: No

假设我有一个python包
myu包
,其中包含一个模块
myu模块
,该模块包含一个函数
myu函数

我试图在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
我对上面第三行的
importorror
感到非常惊讶:既然已经导入了
my_模块
,为什么我不能从中导入函数?也许我对python导入系统是如何工作的有些误解,任何澄清都将不胜感激


下面是目录结构和源代码

my_package
  |- __init__.py
  |- my_module.py
这是
\uuuu init\uuuuu.py
文件

all = ["my_module"]
def my_function():
    pass
这是
my_module.py
文件

all = ["my_module"]
def my_function():
    pass

Python导入系统就是不能这样工作。当您从foo导入栏执行
操作时,
foo
必须是“真实的”完全限定的包或模块名称(或使用点的相对名称)。也就是说,它必须是可以在普通的
导入foo
中使用的东西。它不能只是一个模块对象,你有躺在周围。例如,您也不能这样做:

import foo as bar
from bar import someFunction
这在中有说明,尽管您必须通读该部分才能了解完整情况。它说:

Import语句分两步执行:(1)找到一个模块,必要时对其进行初始化;(2) 在本地命名空间中定义一个或多个名称(import语句发生的范围)。该语句有两种形式,即是否使用
from
关键字。第一个表单(不带
中的
)对列表中的每个标识符重复这些步骤。带有
from
的表单执行步骤(1)一次,然后重复执行步骤(2)

步骤(1)是“查找模块”,如果您继续阅读,您将看到这是它在
sys.modules
sys.path
等中查找的过程。它在导入命名空间中找不到恰好有模块对象作为其值的名称。注意,两种导入的模块查找过程没有什么不同;当您执行
导入foo
时,它查找
foo
的方式与从foo导入栏执行
时的查找方式相同。如果普通的
导入我的\u模块
不起作用(如您的示例中所示),那么来自我的\u模块的
导入内容
也不起作用

请注意,如果您已经导入了该模块,并且只想为其中的函数指定一个较短的名称,则只需为该函数指定一个正则变量即可:

from my_package import my_module
myfunc = my_module.my_function

Python导入系统基本上没有那么好。这是在