我很难理解python导入器的工作原理.. 我有一个python脚本(fractalDimension.py)使用以下方法导入子模块(“greedyColoring.py”):
from boxCovering.greedyColoring import *
直接调用它时效果很好:
python fractalDimension.py
当我将脚本移动到文件夹并添加了导入fractalDimension.py的主脚本时,问题就开始了,因为现在导入的boxCovering子模块不起作用。
在主脚本中,我调用fractalDimension方法:
import fractality.fractalDimension as fd
fd.calculate()
但是当我跑步时
python main.py
我收到以下错误
Traceback (most recent call last):
File "main.py", line 5, in <module>
import fractality.fractalDimension as fd
File "fractalDimension.py", line 11, in <module>
from boxCovering.greedyColoring import *
ImportError: No module named 'boxCovering'
目录布局:
main.py
fractalDimension/
|
+-- __init__.py
+-- fractalDimension.py
+-- boxCovering/
|
+-- __init__.py
+-- greedyColoring.py
两个init文件都是空的
为什么python找不到boxCovering模块?
答案 0 :(得分:3)
错误是由于python正在boxCovering
内搜索名为PYTHONPATH
的顶级包而且不存在(您只有 sub -package在当前目录中,但是没有被搜索过。
如果要导入子包/子模块,则要使用(n显式)相对导入:
from .boxCovering.greedyColoring import *
注意开头的.
(点)。
或者使用绝对导入:
from fractality.fractalDimension.boxCovering.greedyColoring import *
在python2中,导入允许隐式相对导入,这是您尝试执行的操作。在那种情况下导入:
from boxCovering import X
以你正在做的方式完成可能有两个不同的含义:
boxCovering
包fractalDimension
boxCovering
在python3中(参见What's new?和相关的PEP 0328),他们认为这样的导入总是具有第二个含义。如果您想要相对导入,则必须使用相对语法来显式状态,该语法在模块名称的开头使用了一个点。
每个点意味着转到上面的一个目录,因此.
表示当前目录,而..
表示父目录(如在unix路径中)等。
您可以在python2上添加:
启用此语义from __future__ import absolute_import
位于文件顶部。