如何将tar.gz文件打包进Python包并正确配置调用?
问题解答
1. 包安装时如何将services文件夹连同tar.gz文件一起打包
首先你需要先修正setup.py里的参数笔误:原配置里的package参数应为复数packages,否则会无法正确识别包结构。
之后两种方案可选:
- 方案1:直接在
setup()中添加package_data配置,指定要打包的非Python文件:
setuptools.setup( name='magic', packages=setuptools.find_packages(), package_data={ # 键为包名,值为要打包的文件路径匹配规则 "magic": ["services/*.tar.gz"] }, # ...其余配置 )
- 方案2:在项目根目录(和
setup.py同级)新增MANIFEST.in文件,写入以下内容:
include magic/services/*.tar.gz
之后在setup()中添加include_package_data=True参数即可,该方式适合需要批量匹配大量非Python文件的场景。
2. load_services.py中的路径如何填写
推荐使用Python3.8+官方提供的importlib.resources模块读取包内资源,兼容性更强(哪怕包被压缩安装也能正常读取),修改后的代码如下:
from pathlib import Path import shutil import tarfile from importlib.resources import files def load_service(name: str): fname = f'{name}.tar.gz' # 获取magic包下services目录的绝对路径 services_dir = files('magic') / 'services' shutil.copy(services_dir / fname, Path('.')) with tarfile.open(fname, "r:gz") as tar: tar.extractall()
如果需要兼容Python3.8以下版本,也可以通过当前文件的路径推导:
services_dir = Path(__file__).parent / 'services'
注意该方式在包以zip压缩格式导入时会失效。
另外要实现你要求的magic.load_service调用方式,还要在magic/__init__.py中导入该函数:
from .load_services import load_service
3. 上传PyPI的文件大小限制
PyPI对单个上传的包文件(sdist包或者wheel包)的默认大小限制为100MB,如果你的打包后文件超出该限制,需要向PyPI官方提交申请提升限额。
如果你的tar.gz资源文件过大,会大幅增加用户安装时的下载耗时,这种场景更推荐改为运行时动态下载资源,而非打包进安装包。
内容的提问来源于stack exchange,提问作者d-man
相关产品推荐
相关产品推荐

