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

如何为Python .pyz文件实现非捆绑依赖的自动安装?

实现zipapp运行时自动安装依赖

核心思路是在__main__.py的最开始执行依赖安装逻辑,因为zipapp启动时会优先运行这个文件。具体步骤如下:

1. 准备文件结构

确保你的项目目录包含以下两个文件:

my_project/
├── __main__.py
└── requirements.txt

requirements.txt里写入你的依赖,比如:

requests==2.31.0
numpy==1.25.2

2. 在__main__.py中添加依赖安装逻辑

在主程序代码执行前,先检查并安装依赖:

import subprocess
import sys
import pkgutil
import os

def install_requirements():
    # 先尝试导入依赖,避免重复安装
    try:
        # 这里列出你的核心依赖包,全部导入成功则跳过安装
        import requests
        import numpy
        return
    except ImportError:
        pass

    # 读取zipapp内部的requirements.txt内容
    req_data = pkgutil.get_data(__name__, 'requirements.txt')
    if not req_data:
        raise FileNotFoundError("requirements.txt not found in the zipapp")
    reqs_content = req_data.decode('utf-8')

    # 创建临时requirements文件供pip使用
    temp_req_file = 'temp_reqs.txt'
    with open(temp_req_file, 'w', encoding='utf-8') as f:
        f.write(reqs_content)

    # 调用pip安装依赖
    try:
        subprocess.check_call(
            [sys.executable, '-m', 'pip', 'install', '-r', temp_req_file],
            stdout=subprocess.DEVNULL,  # 可选:隐藏安装输出
            stderr=subprocess.STDOUT
        )
    finally:
        # 清理临时文件
        if os.path.exists(temp_req_file):
            os.remove(temp_req_file)

# 先执行依赖安装
install_requirements()

# 主程序逻辑
if __name__ == '__main__':
    print("依赖安装完成,启动主程序...")
    import requests
    response = requests.get("https://example.com")
    print(f"请求状态码: {response.status_code}")

3. 创建zipapp文件

在项目目录的上级目录,执行以下命令生成.pyz文件:

python -m zipapp my_project -o my_app.pyz

关键注意事项

  • 确保运行环境已安装pip(绝大多数Python环境默认包含)
  • 可以根据需求调整安装时的输出(比如去掉stdout和stderr参数查看安装日志)
  • 依赖安装会使用当前Python环境的pip,若需避免全局安装权限问题,可添加--user参数到pip install命令

内容的提问来源于stack exchange,提问作者cwhakes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:22:30