使用setuptools上传PyPI时文件缺失的问题求助
解决setuptools打包时遗漏子模块的问题
我来给你梳理下解决这个打包遗漏问题的所有可行方案,你可以根据自己的包结构选最适合的:
方案1:自动发现所有常规包(最推荐)
如果你的子文件夹都有__init__.py(标准Python包结构),直接用setuptools.find_packages()代替手动指定包列表就行。它会递归扫描当前目录下所有包含__init__.py的文件夹,自动把它们都加入打包范围。
修改后的setup.py代码:
import setuptools setuptools.setup( name="mypkg", version="0.0.2", packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], )
方案2:手动指定所有包和子包
如果你的包结构比较简单,不想用自动发现,也可以手动列出所有需要包含的包(包括子包)。注意:子文件夹必须有__init__.py才能被视为一个Python包。
修改后的setup.py代码:
import setuptools setuptools.setup( name="mypkg", version="0.0.2", packages=['mypkg', 'mypkg.folder1'], # 明确添加子包 classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], )
方案3:处理无__init__.py的命名空间文件夹(Python 3.3+)
如果你的folder1目录没有__init__.py(现代命名空间包结构),可以用setuptools.find_namespace_packages()来自动发现所有模块,不需要手动创建__init__.py。
修改后的setup.py代码:
import setuptools setuptools.setup( name="mypkg", version="0.0.2", packages=setuptools.find_namespace_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], )
方案4:手动包含单个模块文件(适合零散文件)
如果folder1里只有几个单独的.py文件,不想把它做成子包,也可以用py_modules参数指定这些模块。不过这种方法比较繁琐,文件多的时候不推荐。
修改后的setup.py代码:
import setuptools setuptools.setup( name="mypkg", version="0.0.2", packages=['mypkg'], py_modules=['mypkg.folder1.class_a'], # 指定单个模块路径 classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], )
额外小提示
打包后可以先检查内容是否完整:
- 运行
python setup.py sdist生成源码包,解压生成的.tar.gz文件,确认是否包含mypkg/folder1/class_a.py - 或者用
twine check dist/*检查包结构是否符合PyPI要求
内容的提问来源于stack exchange,提问作者ikamen
相关产品推荐
相关产品推荐

