一、问题说明:

在做一个项目,采用包的形式进行文件组织,运行代码是会报错ImportError: attempted relative import with no known parent package,下面先贴出解决方案。

二、解决方案

项目目录示例

└── project
  ├── __init__.py
  ├── main.py
  └── modules
      ├── __init__.py
      └── module1.py
      └── module2.py
  └── ui
      ├── __init__.py
      └── view.py
      └── item.py
  1. 首先,在顶层目录下,创建__init__.py文件,在各级包文件夹下也同时创建__init__.py文件;
  2. view.py引用item.py内的函数或类,需采用如下方式:from ui.item import test,引用modules包下文件内的函数或类,需采用如下方式:
from modules.module1 import crawl
from modules import module2
  1. 项目目录下的main.py文件引用各个包下文件内的函数或类,也需采用下面的方式:
from ui.item import test
from modules.module1 import crawl
from modules import module2

可以发现,上述引用方式均为绝对引用,而不是下述相对引用方式

from .item import test
from ..modules.module1 import crawl

因此,在项目中一般来说最好采用上述绝对引用方式,基本可以避免文件引用问题。

三、优缺点分析

3.1 绝对引用

优点是清晰且直接,可以很容易就确定引用文件位置;且即使当前文件的位置发生变化,导入语句仍然有效。
缺点是当引用路径较为复杂时,导入语句很长,如:
from package1.subpackage2.subpackage3.subpackage4.module5 import function6

3.2 相对引用

最直观的优点就是简洁,在包层次结构较为复杂时,相对引用能够借助于.以较短的代码实现快速的引用。
缺点是较为凌乱,在项目文件位置发生变更时,不易维护;此外,相对引用可读性较差。较难根据引用代码确定引用文件路径。

官方建议,总是优先使用绝对引用,只有在引用路径较为复杂导致引用代码很长时,才考虑使用相对引用。

参考资料

[1] [译][python]ImportError:attempted relative import with no known parent package
[2] python基础教程之执行文件异常报错:ImportError: attempted relative import with no known parent package
[3] Absolute vs Relative Imports in Python
[4] 5. The import system


以上,欢用评论交流。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐