Python子目录脚本导入父级模块方法(不使用sys.path,含site-packages实践验证)
解决方案
一、不使用sys.path的导入实现方式
首先你需要先将项目改造为标准的Python包结构,分别在my-project根目录、subfolder目录下新增空的__init__.py文件,该文件是Python识别目录为可导入包的核心标识。
之后有两种常用的可行方案:
- 方案1:可编辑安装(推荐开发阶段使用)
- 在
my-project根目录新建基础的包配置文件pyproject.toml,内容示例如下:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my_project" version = "0.1.0"- 在
my-project根目录打开终端,执行命令:pip install -e .
该命令会将当前项目以可编辑模式关联到Python环境的依赖库中,你修改项目内的代码不需要重新安装即可生效。之后你在script.py中直接写import useful_functions或者from useful_functions import 对应函数即可正常导入。
- 在
- 方案2:相对导入+模块式运行
你可以在script.py中直接使用相对导入语法:from .. import useful_functions,但注意带相对导入的脚本不能直接用python script.py运行,你需要退到my-project的上级目录,执行命令:python -m my_project.subfolder.script即可正常运行。
注:这里需要先把my-project目录名改为my_project,因为横杠不符合Python模块命名规范,无法被识别为合法的模块名。
二、直接放入Anaconda site-packages的方案是否符合最佳实践
该方案完全不符合Python开发的最佳实践,核心原因如下:
- site-packages目录的设计用途是存放稳定的第三方依赖包,开发中的项目直接放入会导致本地开发代码和正式依赖混淆,极易出现版本冲突、修改不生效等难以排查的问题
- 该操作无法适配多版本、多环境的开发需求,如果你有多个项目需要依赖不同版本的
my-project代码,完全无法实现隔离 - 项目迁移、部署时无法通过依赖清单自动拉取对应包,你需要手动梳理site-packages内的自定义内容,部署成本极高
另外你提到的import my-project.useful_functions写法本身就存在语法错误,Python会将横杠识别为减号,无法正常导入,需要先将目录名改为下划线格式的my_project才符合命名规范。
如果你需要实现全局导入的效果,直接使用前面提到的可编辑安装方案即可,既符合Python的包管理规范,又能满足开发阶段代码修改实时生效的需求。
内容的提问来源于stack exchange,提问作者Cloud Living
相关产品推荐
相关产品推荐

