导入文件时Python导入不起作用

2024-10-01 09:15:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难理解python导入程序是如何工作的。。 我有一个python脚本(分形维数.py)导入子模块(“绿色着色.py)使用:

from boxCovering.greedyColoring import *

当我直接打电话给它时,效果很好:

^{pr2}$

当我将脚本移到一个文件夹并添加一个主脚本来导入分形维数.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模块?在


Tags: 模块frompyimport脚本initmainmodule
1条回答
网友
1楼 · 发布于 2024-10-01 09:15:58

这个错误是由于python正在搜索一个名为PYTHONPATH中的一个名为boxCovering顶级包,但是没有一个包存在(当前目录中只有一个sub-包,但不会搜索到这个包)。在

如果要导入子包/子模块,则需要使用(n个显式)相对导入:

from .boxCovering.greedyColoring import *

注意开头的.(点)。在

或者使用绝对导入:

^{pr2}$

在python2中,导入允许隐式相对导入,这正是您要做的。在这种情况下,导入:

from boxCovering import X

以你现在的方式进行可能有两种不同的含义:

  • 导入fractalDimension包的子包boxCovering
  • 顶级包的导入boxCovering

在python3中(参见What's new?和相关的PEP 0328),他们认为这样的导入总是具有第二个意义。如果你想要一个相对的导入,你必须使用相对语法(在模块名的开头使用一个点)显式地声明。在

每个点表示转到上面的一个目录,因此.表示当前目录,..表示父目录(在unix路径中)等

您可以在python2上启用此语义,添加:

from __future__ import absolute_import

在你文件的顶端。在

相关问题 更多 >