克隆项目后执行python setup.py install无法安装主包的原因排查
这种情况我之前在维护自己的PyPI包时也碰到过,大概率是你的setup.py里的包配置没写对,导致setuptools找不到你的主包代码。下面给你列几个最常见的问题和对应的解决办法:
可能的原因及解决办法
1. 未正确指定packages参数
setuptools需要明确知道要打包哪些代码目录。假设你的项目结构是这样的:
GapBot/ ├── gapbot/ # 你的主包目录,必须包含__init__.py │ ├── __init__.py │ └── 其他代码文件/模块 └── setup.py
那你的setup.py里必须通过find_packages()自动发现包,或者手动指定包名:
from setuptools import setup, find_packages setup( name="GapBot", version="0.1.0", packages=find_packages(), # 自动扫描所有含__init__.py的目录作为包 # 或者手动指定:packages=["gapbot"], install_requires=[...], # 你的依赖包列表 )
如果完全没写packages参数,或者指定的包名和实际目录名不匹配,setuptools就只会安装依赖,不会打包你的主代码。
2. 主包目录缺少__init__.py
setuptools默认只把包含__init__.py的目录识别为Python包。如果你的主包目录(比如gapbot)里没有这个文件,哪怕你写了find_packages(),也会被忽略。赶紧在主包根目录加一个空的__init__.py(如果不需要初始化逻辑的话)。
3. package_dir配置错误
如果你的代码目录和包名不是直接对应的(比如主代码放在src/gapbot下),那需要用package_dir指定映射关系:
setup( ... package_dir={"": "src"}, # 表示所有包的根目录是src packages=find_packages(where="src"), # 在src目录下找包 ... )
如果你的项目结构有嵌套但没配置这个,也会导致setuptools找不到你的主包。
4. 误排除了主包
如果使用find_packages(exclude=["tests", "docs"])之类的参数,有没有不小心把主包也加到排除列表里?仔细检查这个参数的内容,确保没有误删主包。
额外排查步骤
- 先执行
python setup.py sdist生成源码包,然后解压生成的.tar.gz文件,看看里面有没有你的主包代码。如果没有,说明打包阶段就没把代码加进去,install自然也不会装。 - 执行
python setup.py install --verbose,查看输出日志,如果完全没有提到你的主包(比如Installing xxx.py to ...的日志),那肯定是setuptools没识别到你的包。
内容的提问来源于stack exchange,提问作者MrMahdi313




