1

再会,

我对 python 语言非常陌生,我被分配构建一个 python 脚本,该脚本将从电子邮件中获取所有附件文件。附件文件有一个多磁盘部分(.zip、.z01、.z02 等)。使用 zipfile 模块可以轻松提取没有任何多磁盘部分的普通 zip 文件。此代码有效:

password = get_data()
    files = [f for f in os.listdir(source_file_name) if isfile(join(source_file_name, f))]
    for file in files:
        if file.endswith('.zip'):
            file_name_split = file.split("_")
            resource_name = file_name_split[0]
            pswd = password[resource_name]
            if resource_name not in listdir('extracted/'):
                zip_ref = zipfile.ZipFile('attachments/' +file)
                zip_ref.setpassword(pwd = bytes(pswd, 'utf-8'))
                zip_ref.extractall('extracted')
                zip_ref.close()
                os.unlink(source_file_name + file)  

但我不能在多磁盘文件中使用该代码,因为 zip 文件模块不支持带有附加注释的 ZIP 文件,或多磁盘 ZIP 文件,如 Zip 文件模块上的文档所述。我在谷歌搜索替代方案,并通过使用 python 子进程模块来使用 7z 应用程序。这是我的代码。

zip_exe = '"C:/Program Files/7-Zip/7z.exe"' + ' x ' '"' + tmp_folder + 'sample.zip' '"'
subprocess.Popen(zip_exe, shell = True, cwd = tmp_extracted_folder)

这在我的本地使用我的桌面 Windows 10 没有任何问题。但我想知道,我怎样才能把这个脚本放在谷歌云功能上?我m not sure that this will work easily by just putting on this script. Do I need to install 7z application on cloud function? I不确定。你们知道这是否可行吗?我需要帮助,我被这个应用程序卡住了。

如果有其他解决方法,请告诉我。先感谢您。

4

1 回答 1

0

您无法在 Cloud Functions 上安装软件,因为它们不允许您在服务器级别进行交互,因为它是一个无服务器平台,仅执行由事件触发的单一用途功能。

如果您选择使用 7zip 应用程序的方法,则必须使用计算引擎为您的应用程序创建一个服务器实例,但是,这会为您的项目产生服务器成本,我认为这不是您的最佳解决方案问题。

您可以做的是使用与 ZipFile 不同的 Python 库以编程方式解压缩它们,这将在云函数中运行。我个人建议您使用 pyunpack,因为它是我为 Python 找到的最完整的解压缩库。您可以在此链接中查看它的文档,其中包含有关如何实现它的说明和示例,您还可以尝试libarchivelmza(取决于您的 python 版本)。

注意:对于 pyunpack,您还需要导入patool,这是它用来解压文件的“引擎”,否则它将仅依赖 ZipFile 并且无法正常工作。

希望这可以帮助。

于 2020-04-15T12:53:47.163 回答