看来我仍然缺少一些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
