Skip to main content
 首页 » 编程设计

python之了解python中的导入模块

2025年05月04日8arxive

看来我仍然缺少一些python的基础知识。我试图理解 submodules importing ,我觉得我还没有理解。但我也偶然发现了一些新东西。

我在两个不同的 PyDev 项目中有以下两个包:

package1 
| 
+--mod1.py 
| 
+--mod2.py 
 
 
package2 
| 
+--__init__.py 
| 
+--modx.py 
| 
+--mody.py 

在 mod1 ,我可以做 import mod2 .但是在 __init__和 modx , 我做不到 import mody (Eclipse 说“ Unresolved 导入”)。在 __init__ ,我可以做 import .mody或 from .mody import vary .在 modx , 我做不到 import .mody . (事实上​​,我从未见过在 . 语句中使用 import 作为模块的前缀。之前我只遇到过 import mod 和 from mod import var ,但从未见过 import .mod 和 from .mod import var 。)为什么会这样正在发生吗?我一定不知道导致这种行为的某些上下文。但后来我不知道它是什么?

PS:我使用的是 Python 3.4

请您参考如下方法:

Python 处理这两个包的方式之间存在细微差别。
package1被视为 命名空间 包在里面不 包含 __init__.py文件。
package2被视为 常规 包在里面 包含 __init__.py文件。

因此,我将简要说明每个步骤发生的原因:

In mod1, I can do import mod2.



这是由于 命名空间 包使用绝对导入处理。您很可能正在执行 python mod1.py从存储文件的目录中,对(在我尝试重新创建您的文件夹结构并自己在本地测试它时,我做了同样的事情)?所以 package1成为您的 当前工作目录与您的 mod2文件位于该目录的根目录。

对于命名空间包,Python 将默认查找 sys.path试图找到您要求的进口。由于您当前的工作目录会自动添加并包含在 sys.path 中, Python 可以成功找到你的 import mod2请求没有任何困难。

感谢 ShadowRanger 纠正了我对此的最初回应,因为我误解了 Python 如何在其搜索中包含当前工作目录。

In init, I can do import .mody or from .mody import vary.



这是因为 Python 将其视为 常规 包裹。在这种情况下,您的常规包的名称是 package2 .当您使用 .表示法,您要求 Python 开始搜索来自 的导入。当前包(在这种情况下是你的 parent package2 )。所以你必须使用 import .mody找到 mody当前包中的包。

如果您使用 ..然后它将从当前包的父级导入,依此类推。

点符号很有用,因为您明确声明您希望仅从当前包中搜索 - 所以如果有另一个 package2包裹在您的 PYTHONPATH 上, Python 会知道选择哪一个。

But in init and modx, I cannot do import mody (Eclipse says "unresolved imports").



与 __init__.py这是因为您没有使用点符号,也没有告诉 Python 您希望在 中搜索这些模块。当前包裹。所以它正在寻找 Python 标准库和您的 PYTHONPATH对于这些包,但没有找到它们(因此在 Eclipse 中出现错误)。通过使用点表示法,您声明您希望在搜索中包含当前包,因此 Python 将能够找到这些文件。

使用这样的点符号,通过 from . import mody 导入, 是使用 相对进口 .

与 modx您还必须使用相对导入(请参阅下一节)。

In modx, I cannot do import .mody. Why this might be happening?



这是因为您没有使用 相对/绝对导入 .在这种情况下,您将使用相对导入。相对导入是 from . import mody你已经看过的语法。 Python 中默认使用相对或绝对导入行为。

它现在是默认行为,与旧的 Python import 一样行为,假设 Python 自己的标准库有一个名为 mody 的包.当你使用 import mody它以前会导入 mody从您的包裹和 不是 标准库。这并不总是可取的。如果您特别想要标准库版本怎么办?

所以现在你的导入必须使用 from . import mody或 from .mody import vary这样导入的语法就很清楚了。如果您使用 import而不是 from...语法,Python 将假定它是一个标准库或 PYTHONPATH进口。

顺便说一句,上述许多信息的来源来自以下网站:

https://docs.python.org/3/reference/import.html

https://docs.python.org/2.5/whatsnew/pep-328.html