繁体   English   中英

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 barfoo必须是“真实的”,完全限定的程序包或模块名称(或使用点的相对名称)。 也就是说,它必须是可以在普通import foo使用的东西。 它不能只是您周围的模块对象。 例如,您也不能这样做:

import foo as bar
from bar import someFunction

文档中对此进行了说明 ,尽管您必须通读该部分以获取完整内容。 它说:

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

步骤(1)是“查找模块”,如果继续阅读,您会发现它是在sys.modulessys.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM