web-dev-qa-db-fra.com

Ecrivez dans le répertoire / tmp dans aws lambda avec python

Objectif

J'essaie d'écrire un fichier Zip dans le dossier/tmp dans un python aws lambda, donc je peux extraire manipuler avant de zipper et le placer dans le seau s3.

Problème

Système de fichiers en lecture seule Os Errno30

Ce code a été testé localement sur mon ordinateur pour s'assurer que le fichier serait écrit dans mon répertoire de travail avant de le télécharger sur aws. C'est le code que j'essaie d'utiliser.

file = downloadFile() #This is api call that returns binary Zip object
newFile = open('/tmp/myZip.Zip','wb')
newFile.write(file)
extractAll('/tmp/myZip.Zip')

voici le code qui essaie d'extraire le fichier Zip

def extractAll(self,source):
        with zipfile.ZipFile(source, 'r') as archive:
            archive.extractall()

voici la trace

[Errno 30] Read-only file system: '/var/task/test-deploy': OSError
Traceback (most recent call last):
File "/var/task/web.py", line 31, in web
performAction(bb, eventBody)
File "/var/task/src/api/web.py", line 42, in performAction
zipHelper.extractAll('/tmp/myZip.Zip')
File "/var/task/src/shared/utils/zipfilehelper.py", line 24, in extractAll
archive.extractall()
File "/var/lang/lib/python3.6/zipfile.py", line 1491, in extractall
self.extract(zipinfo, path, pwd)
File "/var/lang/lib/python3.6/zipfile.py", line 1479, in extract
return self._extract_member(member, path, pwd)
File "/var/lang/lib/python3.6/zipfile.py", line 1538, in _extract_member
os.mkdir(targetpath)
OSError: [Errno 30] Read-only file system: '/var/task/test-deploy'
8
Codyj110

extractAll() extraira les fichiers du répertoire courant, qui est /var/task/test-deploy dans votre cas.

Vous devez utiliser os.chdir() pour changer le répertoire courant:

import os, zipfile

os.chdir('/tmp')
with zipfile.ZipFile(source, 'r') as archive:
    archive.extractall()

Encore mieux, vous pouvez créer un répertoire temporaire et y extraire les fichiers, pour éviter de polluer /tmp:

import os, tempfile, zipfile

with tempfile.TemporaryDirectory() as tmpdir:
    os.chdir(tmpdir)
    with zipfile.ZipFile(source, 'r') as archive:
        archive.extractall()

Si vous souhaitez restaurer le répertoire de travail actuel après avoir extrait le fichier, pensez à utiliser ce décorateur:

import os, tempfile, zipfile, contextlib

@contextlib.context_manager
def temporary_work_dir():
    old_work_dir = os.getcwd()
    with tempfile.TemporaryDirectory() as tmp_dir:
        os.chdir(tmp_dir)
        try:
            yield
        finally:
            os.chdir(old_work_dir)

with temporary_work_dir():
    with zipfile.ZipFile(source, 'r') as archive:
        archive.extractall()
6
Andrea Corbellini