You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Flatpak环境中使用py7zr提取7z归档文件的依赖问题求助

我之前在Flatpak环境里处理7z解压的时候也踩过一模一样的坑,py7zr的依赖链在沙箱里确实容易出各种幺蛾子。给你两个可行的解决方案,优先推荐第一个,省心又稳定:

方案1:改用系统级p7zip命令行工具(强烈推荐)

这个方法直接绕开Python库的依赖麻烦,用成熟的原生工具,兼容性拉满。

  1. 修改你的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包,不过上面的方式更通用)

  1. 在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沙箱里编译需要额外的编译工具链。

  1. 先给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
  1. 重新生成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

火山引擎 最新活动