Python 导入文件时导入不起作用
Python import doesn't work when file is imported
我很难理解 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
两个初始化文件都是空的
为什么python找不到boxCovering模块?
错误是由于 python 正在 PYTHONPATH
中搜索名为 boxCovering
的 顶级 包,并且none 存在(您在当前目录中只有一个 sub-包,但未搜索到)。
当你想导入一个 subpackage/submodule 时你想使用(显式)相对导入:
from .boxCovering.greedyColoring import *
注意开头的 .
(点)。
或者使用绝对导入:
from fractality.fractalDimension.boxCovering.greedyColoring import *
在 python2 中,导入允许隐式相对导入,这正是您想要做的。在这种情况下,导入:
from boxCovering import X
按照您的方式完成可能有两种不同的含义:
- 导入
fractalDimension
包的子包 boxCovering
- 导入顶层包
boxCovering
在 python3(参见 What's new? and relevant PEP 0328)中,他们决定这样的导入 always 具有第二个含义。如果你想要一个相对导入,你必须明确地声明所以通过使用相对语法,它在模块名称的开头使用一个点。
每个点表示转到上面的一个目录,因此 .
表示当前目录,而 ..
表示父目录(如在 unix 路径中)等。
您可以在 python2 添加以下内容启用此语义:
from __future__ import absolute_import
在文件的顶部。
我很难理解 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
两个初始化文件都是空的
为什么python找不到boxCovering模块?
错误是由于 python 正在 PYTHONPATH
中搜索名为 boxCovering
的 顶级 包,并且none 存在(您在当前目录中只有一个 sub-包,但未搜索到)。
当你想导入一个 subpackage/submodule 时你想使用(显式)相对导入:
from .boxCovering.greedyColoring import *
注意开头的 .
(点)。
或者使用绝对导入:
from fractality.fractalDimension.boxCovering.greedyColoring import *
在 python2 中,导入允许隐式相对导入,这正是您想要做的。在这种情况下,导入:
from boxCovering import X
按照您的方式完成可能有两种不同的含义:
- 导入
fractalDimension
包的子包boxCovering
- 导入顶层包
boxCovering
在 python3(参见 What's new? and relevant PEP 0328)中,他们决定这样的导入 always 具有第二个含义。如果你想要一个相对导入,你必须明确地声明所以通过使用相对语法,它在模块名称的开头使用一个点。
每个点表示转到上面的一个目录,因此 .
表示当前目录,而 ..
表示父目录(如在 unix 路径中)等。
您可以在 python2 添加以下内容启用此语义:
from __future__ import absolute_import
在文件的顶部。