[英]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
必须是“真实的”,完全限定的程序包或模块名称(或使用点的相对名称)。 也就是说,它必须是可以在普通import foo
使用的东西。 它不能只是您周围的模块对象。 例如,您也不能这样做:
import foo as bar
from bar import someFunction
文档中对此进行了说明 ,尽管您必须通读该部分以获取完整内容。 它说:
导入语句分两个步骤执行:(1)找到一个模块,并在必要时对其进行初始化; (2)在本地名称空间中定义一个或多个名称(属于import语句的作用域)。 该语句有两种形式,即是否使用
from
关键字。 第一种形式(没有from
)对列表中的每个标识符重复这些步骤。 与形式from
执行步骤(1)一次,然后(2)重复地执行步骤。
步骤(1)是“查找模块”,如果继续阅读,您会发现它是在sys.modules
, sys.path
等中查找的过程。恰好具有模块对象作为其值的导入名称空间。 注意,两种导入的模块查找过程没有什么不同。 import foo
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.