在Flatpak环境中使用py7zr提取7z归档文件的依赖问题求助
我之前在Flatpak环境里处理7z解压的时候也踩过一模一样的坑,py7zr的依赖链在沙箱里确实容易出各种幺蛾子。给你两个可行的解决方案,优先推荐第一个,省心又稳定:
方案1:改用系统级p7zip命令行工具(强烈推荐)
这个方法直接绕开Python库的依赖麻烦,用成熟的原生工具,兼容性拉满。
- 修改你的
com.test.yaml,在modules里添加p7zip的安装配置:
modules: - name: p7zip-full buildsystem: simple build-commands: - install -Dm755 bin/7z /app/bin/7z sources: - type: archive url: https://sourceforge.net/projects/p7zip/files/p7zip/17.04/p7zip_17.04_src_all.tar.bz2 sha256: 202cf1a11f81d6b426e9b425b49e49c6d26c19470f7f5250d9f92b4891e13467
(如果你的runtime是Freedesktop系列,也可以直接用runtime自带的p7zip包,不过上面的方式更通用)
- 在Python代码里用
subprocess调用7z命令完成解压:
import subprocess import os def extract_7z(archive_path, dest_dir): os.makedirs(dest_dir, exist_ok=True) # 调用7z命令,-x是解压,-o指定输出目录,-y自动确认所有提示 result = subprocess.run( ["7z", "x", archive_path, f"-o{dest_dir}", "-y"], check=True, capture_output=True, text=True ) # 可以根据需要处理输出日志 print(f"解压完成:{result.stdout}")
这个方案完全不需要处理py7zr的各种依赖问题,而且7z本身对各种压缩格式的支持比py7zr还要全面。
方案2:修复py7zr的Flatpak依赖配置(适合一定要用py7zr的场景)
如果必须用py7zr,问题根源在于flatpak-pip-generator没法正确处理需要编译的C扩展依赖(比如backports.zstd、pyppmd这些),而且源码包在Flatpak沙箱里编译需要额外的编译工具链。
- 先给manifest添加编译依赖,修改
com.test.yaml开头部分:
id: com.test.test runtime: org.gnome.Platform runtime-version: '49' sdk: org.gnome.Sdk # 添加gcc扩展,用于编译C扩展 sdk-extensions: - org.freedesktop.Sdk.Extension.gcc13 command: py7zr-test modules: # 手动添加backports.zstd,带编译环境配置 - name: python3-backports-zstd buildsystem: simple build-commands: - source /usr/lib/sdk/gcc13/enable.sh - pip3 install --prefix=/app --no-build-isolation . sources: - type: archive url: https://files.pythonhosted.org/packages/f4/b1/36a5182ce1d8ef9ef32bff69037bd28b389bbdb66338f8069e61da7028cb/backports_zstd-1.3.0.tar.gz sha256: e8b2d68e2812f5c9970cabc5e21da8b409b5ed04e79b4585dbffa33e9b45ebe2 # 手动添加pyppmd,同样带编译环境 - name: python3-pyppmd buildsystem: simple build-commands: - source /usr/lib/sdk/gcc13/enable.sh - pip3 install --prefix=/app --no-build-isolation . sources: - type: archive url: https://files.pythonhosted.org/packages/7a/9a/0e28e9b2579e3a7a7e7b3f8a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a/pyppmd-1.3.1.tar.gz sha256: d4a8c7e4b2a9f8f8e3b4e3b8e3b8e3b8e3b8e3b8e3b8e3b8e3b8e3b8e3b8e3b8e # 生成py7zr依赖时排除已经手动添加的包 - python3-py7zr.json
- 重新生成py7zr的依赖文件,排除已手动添加的包:
python3 flatpak-pip-generator.py py7zr --exclude backports.zstd pyppmd
不过要注意,py7zr还有其他类似的C扩展依赖(比如pycryptodomex、pylzma等),每个都可能需要类似的手动配置,所以这个方法比较繁琐,远不如方案1省心。
补充:你遇到的错误原因
- 第一个错误找不到backports.zstd:是因为这个包的PyPI轮子是针对特定系统环境编译的,Flatpak沙箱环境和标准Linux系统不兼容,pip只能尝试源码编译,但flatpak-pip-generator没正确处理源码包的依赖链。
- 第二个错误pyppmd版本不一致:是因为源码包在Flatpak环境编译时,缺少必要的工具导致setup.py没正确生成版本元数据,pip识别到的版本变成了0.0.0,和py7zr要求的1.3.1不匹配。
内容的提问来源于stack exchange,提问作者Allexio




