pip安装sdist格式Python包时未部署代码的原因及解决方法
为什么pip install没有安装我的Python包代码?
我来帮你分析这个问题——你遇到的核心问题是setup.py里的packages参数配置有误,导致setuptools没有正确识别并打包你的嵌套包结构。
问题原因
当你使用find_packages(include=["PackageA.PackageB"])时,这个函数只会返回PackageA.PackageB这一个子包。但Python的嵌套包依赖于上层包(也就是PackageA)的存在才能被正确导入:如果PackageA没有被安装到site-packages目录里,Python就找不到PackageA.PackageB这个路径。
更关键的是,setuptools在这种仅指定子包的情况下,不会自动将上层的PackageA包含进来,最终导致安装后只有egg-info目录,而没有实际的包代码文件。
解决方法
你有两种简单的修复方式,任选其一即可:
方式一:修改find_packages的include参数
让find_packages同时包含PackageA及其所有子包,修改后的setup.py如下:
from setuptools import find_packages, setup setup( name="my-code", version="0.1", install_requires=[], # 包含PackageA本身和它下面的所有子包 packages=find_packages(include=["PackageA", "PackageA.*"]), include_package_data=True, description="My Code" )
方式二:显式列出所有需要的包
如果你想更明确地控制打包内容,可以直接把所有需要的包都列出来:
from setuptools import setup setup( name="my-code", version="0.1", install_requires=[], packages=["PackageA", "PackageA.PackageB"], include_package_data=True, description="My Code" )
验证步骤
修改完setup.py后,按照以下步骤重新打包安装:
- 先清理之前的构建文件:
rm -rf dist build *.egg-info(Windows系统用rmdir /s /q dist build *.egg-info) - 重新生成sdist:
python setup.py sdist --formats=gztar - 安装新的包文件:
pip install dist/my-code-0.1.tar.gz
这时候你再去venv的Lib/site-packages目录,就能看到PackageA目录了,也可以正常导入PackageA.PackageB.Module1了。
内容的提问来源于stack exchange,提问作者urig
相关产品推荐
相关产品推荐

