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

Spark --py-files对Python生成的Zip无效,Mac压缩则正常

解决Spark --py-files加载Python包Zip时ModuleNotFoundError问题

问题核心原因

手动压缩(Mac右键)能正常加载,Python代码生成的Zip报错,核心差异是Zip内的目录结构:

  • 手动压缩时,你是将packages文件夹内的hvac、certifi等包目录直接压缩到Zip根目录;
  • 而Python代码生成的Zip里,这些包目录被嵌套在packages目录下,导致Spark无法直接找到hvac模块。

修正后的压缩代码

调整压缩逻辑,确保包目录直接位于Zip根目录,而非嵌套在packages文件夹下:

import os
import zipfile

def zip_dirs() -> None:
    path = "./packages"  # 指定存放依赖的packages目录路径
    with zipfile.ZipFile('packages.zip', 'w', zipfile.ZIP_DEFLATED) as zip_file:
        # 遍历packages目录下的所有文件和子目录
        for root, _, files in os.walk(path):
            for file in files:
                if file == '.DS_Store':
                    continue
                # 获取文件的绝对路径
                file_path = os.path.join(root, file)
                # 计算Zip内的相对路径:相对于packages目录,而非父目录
                arcname = os.path.relpath(file_path, path)
                zip_file.write(file_path, arcname)

验证步骤

  1. 运行修改后的函数生成Zip文件;
  2. 解压Zip,检查根目录是否直接包含hvac、certifi等包文件夹(而非嵌套在packages目录下);
  3. 将该Zip上传到S3,通过Spark的--py-files参数加载,即可正常导入hvac模块。

补充:shutil的正确用法

如果想用shutil实现相同效果,需先进入packages目录再压缩内容:

import shutil
import os

# 切换到packages目录
os.chdir("./packages")
# 压缩当前目录下所有内容到上级目录的packages.zip
shutil.make_archive('../packages', 'zip', root_dir='.')
# 切回原工作目录
os.chdir("..")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:30:15