如何让Python 3.6支持from package.module.submodule import SomeClass式绝对导入?
在Python 3.6中实现
from package.module.submodule import SomeClass导入的必备条件 好的,咱们来拆解一下在2018年的Python 3.6环境里,实现这种层级式导入需要满足的核心条件——像Django、TensorFlow这类大型项目都是严格遵循这些规则来组织代码的:
符合规范的包目录结构
每个层级的目录都需要包含__init__.py文件,哪怕这个文件是空的也没关系。它的核心作用是告诉Python:“这个目录是一个可导入的包/子包”。
对应的目录结构必须和导入路径完全匹配:比如要实现from package.module.submodule import SomeClass,你的文件夹结构得是这样的:parent_directory/ package/ __init__.py module/ __init__.py submodule.py # 这里定义了SomeClass # 或者是submodule目录: # submodule/ # __init__.py # some_file.py # 定义了SomeClass,且submodule/__init__.py里导入了它包的根目录必须在Python的模块搜索路径中
Python只会在sys.path列表包含的目录下查找可导入的包和模块。你可以通过import sys; print(sys.path)查看当前的搜索路径。
常见的将根目录加入搜索路径的方式有三种:- 通过
pip install将包安装到Python的site-packages目录,这是大型项目的标准做法,安装后包会自动被加入搜索路径。 - 开发调试时,手动将包的父目录添加到
sys.path(比如sys.path.append("/path/to/parent_directory")),但这种方式不推荐在生产环境使用。 - 运行Python脚本时,将包的父目录设为当前工作目录,因为当前目录默认会被加入
sys.path。
- 通过
目标类/对象必须存在于指定的子模块中
- 如果
submodule是单个.py文件,那么SomeClass必须直接定义在这个文件里。 - 如果
submodule是一个子包(目录),那它的__init__.py文件里必须导入或定义SomeClass,比如在submodule/__init__.py中写from .some_file import SomeClass,这样外部才能通过submodule.SomeClass访问到这个类。
- 如果
避免命名冲突
要确保你的包名、模块名不会和Python标准库或者已安装的第三方包重名。比如你不能把自己的包命名为requests,否则Python会优先导入搜索路径中先出现的同名模块,导致你的代码无法被正确导入。
内容的提问来源于stack exchange,提问作者gmolau
相关产品推荐
相关产品推荐

