Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Spark中EMR上的.zip文件(使用zipfile包在python中创建)和--py文件导入模块时出现问题_Python_Python 3.x_Pyspark_Amazon Emr - Fatal编程技术网

从Spark中EMR上的.zip文件(使用zipfile包在python中创建)和--py文件导入模块时出现问题

从Spark中EMR上的.zip文件(使用zipfile包在python中创建)和--py文件导入模块时出现问题,python,python-3.x,pyspark,amazon-emr,Python,Python 3.x,Pyspark,Amazon Emr,我正在尝试将我的应用程序归档到我的测试文件中,以便在EMR群集上进行spark submit,如下所示: with zipfile.ZipFile('deps.zip','w') as zipf: for file in file_paths: zipf.write(file,os.path.relpath(file,'..')) 模块的文件夹结构: app --- module1 ------ test.py ------ test2.py --- m

我正在尝试将我的应用程序归档到我的测试文件中,以便在EMR群集上进行spark submit,如下所示:

with zipfile.ZipFile('deps.zip','w') as zipf:
        for file in file_paths:
            zipf.write(file,os.path.relpath(file,'..'))
模块的文件夹结构:

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是使用以下方法创建的:
zip-r deps.zip模块1模块2
是相同的结构,当我使用spark提交它时,它会起作用

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'
我不知道为什么在python中创建的zip文件会不同于在python之外创建的zip文件,但我已经花了几天的时间在这方面,希望有人能提供帮助


谢谢

事实证明这是一件相当简单的事情

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

工作和非工作的zip解压缩到同一个东西上吗?对我来说,它们看起来完全一样,是的。为了补充参考,我一直在尝试其他问题,所以我想知道差异是否是
zipfile.zip_DEFLATED