使用带有--py文件的.zip文件(使用zipfile包在python中创建)导入模块时出现问题

问题描述 投票:0回答:1

我试图将我的应用程序存档在我的测试文件中以激发EMR集群上的提交,如下所示:

模块的文件夹结构:

app
--- module1
------ test.py
------ test2.py
--- module2
------ file1.py
------ file2.py

我正在通过测试调用Zip函数

import zipfile
import os

def zip_deps():
    # make zip

    module1_path = '../module1'
    module2_path = '../module2'
    try:
        with zipfile.ZipFile('deps.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
            info = zipfile.ZipInfo(module1_path +'/')
            zipf.writestr(info, '')
            for root, dirs, files in os.walk(module1_path):
                for d in dirs:
                    info = zipfile.ZipInfo(os.path.join(root, d)+'/')
                    zipf.writestr(info, '')
                for file in files:
                    zipf.write(os.path.join(root, file),os.path.relpath(os.path.join(root, file)))

            info = zipfile.ZipInfo(module2_path +'/')
            zipf.writestr(info, '')
            for root, dirs, files in os.walk(module2_path):
                for d in dirs:
                    info = zipfile.ZipInfo(os.path.join(root, d)+'/')
                    zipf.writestr(info, '')
                for file in files:
                    zipf.write(os.path.join(root, file),os.path.relpath(os.path.join(root, file)))
    except:
        print('Unexpected error occurred while creating file deps.zip')
    zipf.close()

deps.zip是正确创建的,据我所知,它会压缩我想要的所有文件,每个模块文件夹都在zip的基础级别。事实上,使用:zip -r deps.zip module1 module2创建的确切拉链是相同的结构,当我点火提交它时,这是有效的

spark-submit --py-files deps.zip driver.py 

EMR出错:

Traceback (most recent call last):
  File "driver.py", line 6, in <module>
    from module1.test import test_function
ModuleNotFoundError: No module named 'module1'

FWIW我也尝试使用以下命令使用子进程进行压缩,并且在EMR中我在spark中得到了相同的错误

os.system("zip -r9 deps.zip ../module1")
os.system("zip -r9 deps.zip ../module2")

我不知道为什么在python中创建的zip文件与python之外的文件不同,但是我在最后几天花了很多时间,希望有人可以提供帮助!

谢谢!!

python python-3.x pyspark amazon-emr
1个回答
0
投票

事实证明这是相当简单的......

Zipfile使用相对目录保存完整文件名,例如:

../module1/test.py

spark除了顶层的文件夹外没有相对路径,如:

module1/test.py

我只需要改变我的写作就像这样:

with zipfile.ZipFile('deps.zip','w') as zipf:
        for file in file_paths:
            zipf.write(file,os.path.relpath(file,'..'))

如果您提取原始zip文件,您将永远不会看到前面带有../的名称。耸

© www.soinside.com 2019 - 2024. All rights reserved.