Python项目文件引用问题:ImportError: attempted relative import with no known parent package
一、问题说明:
在做一个项目,采用包的形式进行文件组织,运行代码是会报错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
- 首先,在顶层目录下,创建
__init__.py
文件,在各级包文件夹下也同时创建__init__.py
文件; view.py
引用item.py
内的函数或类,需采用如下方式:from ui.item import test
,引用modules
包下文件内的函数或类,需采用如下方式:
from modules.module1 import crawl
from modules import module2
- 项目目录下的
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
以上,欢用评论交流。
更多推荐
所有评论(0)