PyPI包上传求助:执行python setup.py sdist报错及模块导入失败
解决PyPI包上传与模块导入的双重问题
我来帮你搞定这个PyPI打包和导入的问题,咱们一步步来排查解决:
问题根源分析
从你给出的报错和操作经历来看,核心问题是setup.py里声明的包名和实际项目的目录结构不匹配:
- 第一次执行
sdist时提示找不到LootGameApi目录,说明你setup.py里packages参数指定的名称和实际存在的目录名对不上; - 强行指定后虽然打包成功,但导入失败,是因为你的目录没有符合Python的模块规范(要么缺了
__init__.py,要么层级/名称还是错的)。
具体解决步骤
1. 先把项目目录结构掰正
Python对包的结构有明确要求,你的项目得是这种标准格式:
你的项目根文件夹/ ├── LootGameBotApi/ # 这里是你的实际包目录,名字必须和setup.py里的声明完全一致(大小写敏感!) │ ├── __init__.py # 这个文件必须有!哪怕是空的,它是Python识别这是个包的标记 │ └── 你的模块文件.py # 比如你写的api核心代码、工具类之类的文件 └── setup.py
⚠️ 重点:如果你的setup.py里写的name="LootGameBotApi",那实际目录名就必须是LootGameBotApi,不能是LootGameApi(少了Bot的后缀),这就是你第一次报错的核心原因!
2. 修正setup.py的packages配置
推荐用find_packages()自动识别包,避免手动输入出错,setup.py可以这么写:
from setuptools import setup, find_packages setup( name="LootGameBotApi", version="0.1.0", packages=find_packages(), # 自动找到所有符合规范的包目录 # 下面是其他必填/可选配置,按需补充 author="你的名字", description="LootGame Bot的API封装", install_requires=["requests", ...], # 你的包依赖的其他库 )
如果非要手动指定packages,就写你实际存在的目录名:
packages=["LootGameBotApi"],
3. 本地先验证,再打包
别着急直接上传,先在本地测试是否能正常导入:
- 执行
pip install -e .(这是开发模式安装,修改代码后不用重新安装就能生效); - 打开Python终端,尝试导入:
import LootGameBotApi # 或者导入具体模块 from LootGameBotApi import your_module_name
如果导入成功,说明包结构没问题,再执行python setup.py sdist,这次应该不会再报目录不存在的错了。
4. 上传PyPI的小建议
现在官方更推荐用twine来上传包,比直接用setup.py upload更安全,步骤是:
- 先安装twine:
pip install twine; - 打包完成后,执行
twine upload dist/*,然后输入你的PyPI账号密码即可。
内容的提问来源于stack exchange,提问作者Alessio Balderi
相关产品推荐
相关产品推荐

