Python:从已导入的模块导入函数
假设我有一个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
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导入系统基本上没有那么好。这是在