You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:24:04