开发者社区> 问答> 正文

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

宋淑婷 2019-04-22 15:52:46 395

我试图将我的应用程序存档在我的测试文件中以激发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

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")

分布式计算 Spark Python
分享到
取消 提交回答
全部回答(1)
  • 宋淑婷
    2019-07-17 23:33:58

    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文件,您将永远不会看到../前面的名称。

    0 0
+ 订阅

大数据计算实践乐园,近距离学习前沿技术

推荐文章
相似问题
推荐课程