Setuptools分发单模块Python包如何实现指定名称直接导入
你的问题核心是PyPI分发包名(setup函数中name字段指定的gerador_endereco)和实际代码的可导入包目录名没有对应,find_packages()默认会扫描所有包含__init__.py的目录作为可导入包,你当前的代码目录名为my_package,所以安装后可导入的根包名就是my_package,和PyPI上的分发包名相互独立。
你可以通过以下两种方案调整实现预期的导入效果:
方案1:调整目录结构(最推荐,兼容性最好)
直接修改代码目录的名称,让可导入包名和分发包名保持一致,操作步骤如下:
- 将原
my_package文件夹重命名为gerador_endereco,调整后的仓库结构为:
gerador_endereco/ -- setup.py -- gerador_endereco/ -- __init__.py -- gerador_endereco.py
- 编辑
gerador_endereco/__init__.py,添加内容将子模块的公开内容导出:
from .gerador_endereco import *
setup.py无需修改,find_packages()会自动识别到gerador_endereco目录作为可导入包。重新打包上传新版本到PyPI后,就可以直接通过from gerador_endereco import *导入使用。
方案2:保留现有目录结构,修改setup.py配置
如果不想调整现有目录结构,可以通过package_dir参数指定包的映射关系,操作步骤如下:
- 修改
setup.py中的配置,替换原有的packages=find_packages()配置:
setup( name='gerador_endereco', version='1.0.4', author='Michel Metran', description='API para criação ...', url='https://github.com/open-dsa/gerador_endereco', packages=['gerador_endereco'], package_dir={'gerador_endereco': 'my_package'}, install_requires=requirements, )
- 和方案1相同,编辑
my_package/__init__.py,添加内容导出子模块的公开内容:
from .gerador_endereco import *
- 重新打包上传新版本到PyPI后即可实现预期的导入效果。
两种方案调整完成后,都需要升级版本号重新打包上传,本地升级安装对应新版本后即可正常使用from gerador_endereco import *的导入方式。
内容的提问来源于stack exchange,提问作者Michel Metran
相关产品推荐
相关产品推荐

