PyPI打包中src文件夹有特殊含义吗?可将包直接放根目录吗
Python打包中
src/目录的作用与根目录直接放包的风险说明 src/目录不是PyPI打包的强制必填项,你给出的无src扁平目录结构不会直接触发打包报错,完全可以正常使用,但教程默认推荐src布局,核心是为了规避大量新手极易踩中的隐式问题,两种布局的实际差异如下:
src/布局的核心作用是做导入隔离
加这层目录的本质,是强制让你在本地开发、测试时,必须通过pip install(包括可编辑模式安装pip install -e .)把包装到当前Python环境后,才能正常导入包内容。这层隔离能从目录结构上避免「本地测试全通过,发版后用户装完跑不起来」的经典问题。- 直接把包放在项目根目录的扁平布局,存在几个高频踩坑点:
- 测试结果失真:Python运行时默认会把当前执行命令的工作目录加入导入搜索路径,如果你在项目根目录跑测试、写脚本,哪怕你根本没执行安装操作,也能直接导入根目录下的包文件夹。这种情况下你根本测不到打包后的真实效果——很可能你打包配置漏写了包路径、漏加了资源文件、子模块没被包含,本地完全发现不了,等传到PyPI用户安装后才发现是个空包、或者缺文件。
- 容易出现导入冲突:项目根目录一般会放测试脚本、配置文件、工具脚本,如果这些文件/文件夹的名字和你依赖的第三方包重名,Python导入时会优先读取根目录下的内容,要么覆盖第三方依赖导致运行报错,要么把不该打包进发行版的杂项文件一起打进包,增加包体积甚至引发逻辑错误。
- 可编辑安装的污染问题:用扁平布局做可编辑安装时,整个项目根目录都会被加入Python的导入路径,根目录下所有零散的py文件都会变成可直接导入的模块,很容易出现莫名其妙的命名冲突。
- 扁平布局不是不能用
如果你对Python的导入路径规则、打包配置逻辑足够熟悉,每次发版前都会在干净的虚拟环境里、跳出项目目录做安装校验,扁平布局完全可以正常工作,不少成熟开源项目也在使用这种结构,不存在必然的配置冲突或者打包异常,只是对新手来说容错率极低。
小提示:不管用哪种目录结构,打包完成后建议先跳出项目根目录,在全新的虚拟环境里执行安装、导入测试,再核对安装后的文件列表,就能规避绝大多数布局相关的打包问题。
内容的提问来源于stack exchange,提问作者Wolpertinger
相关产品推荐
相关产品推荐

