Загрузка кода Python3 в корзину S3 с IO вместо String IO - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь загрузить zip-файл в память, развернуть его и загрузить на S3.

import boto3
import io
import zipfile
import mimetypes

s3 = boto3.resource('s3')
service_zip = io.BytesIO()

service_bucket = s3.Bucket('services.mydomain.com')
build_bucket = s3.Bucket('servicesbuild.mydomain.com')


build_bucket.download_fileobj('servicesbuild.zip', service_zip)

with zipfile.ZipFile(service_zip) as myzip:
    for nm in myzip.namelist():
        obj = myzip.open(nm)
        print(obj)
        service_bucket.upload_fileobj(obj,nm, 
                ExtraArgs={'ContentType': mimetypes.guess_type(nm)[0]})
        service_bucket.Object(nm).Acl().put(ACL='public-read')

Вот ошибка, которую я получаю


<zipfile.ZipExtFile name='favicon.ico' mode='r' compress_type=deflate>
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-5941e5e45adc> in <module>
     18         print(obj)
     19         service_bucket.upload_fileobj(obj,nm, 
---> 20                                      ExtraArgs={'ContentType': mimetypes.guess_type(nm)[0]})
     21         service_bucket.Object(nm).Acl().put(ACL='public-read')

~/bitbucket/clguru/env/lib/python3.7/site-packages/boto3/s3/inject.py in bucket_upload_fileobj(self, Fileobj, Key, ExtraArgs, Callback, Config)
    579     return self.meta.client.upload_fileobj(
    580         Fileobj=Fileobj, Bucket=self.name, Key=Key, ExtraArgs=ExtraArgs,
--> 581         Callback=Callback, Config=Config)
    582 
    583 

~/bitbucket/clguru/env/lib/python3.7/site-packages/boto3/s3/inject.py in upload_fileobj(self, Fileobj, Bucket, Key, ExtraArgs, Callback, Config)
    537             fileobj=Fileobj, bucket=Bucket, key=Key,
    538             extra_args=ExtraArgs, subscribers=subscribers)
--> 539         return future.result()
    540 
    541 

~/bitbucket/clguru/env/lib/python3.7/site-packages/s3transfer/futures.py in result(self)
     71             # however if a KeyboardInterrupt is raised we want want to exit
     72             # out of this and propogate the exception.
---> 73             return self._coordinator.result()
     74         except KeyboardInterrupt as e:
     75             self.cancel()

~/bitbucket/clguru/env/lib/python3.7/site-packages/s3transfer/futures.py in result(self)
    231         # final result.
    232         if self._exception:
--> 233             raise self._exception
    234         return self._result
    235 

~/bitbucket/clguru/env/lib/python3.7/site-packages/s3transfer/tasks.py in _main(self, transfer_future, **kwargs)
    253             # Call the submit method to start submitting tasks to execute the
    254             # transfer.
--> 255             self._submit(transfer_future=transfer_future, **kwargs)
    256         except BaseException as e:
    257             # If there was an exception raised during the submission of task

~/bitbucket/clguru/env/lib/python3.7/site-packages/s3transfer/upload.py in _submit(self, client, config, osutil, request_executor, transfer_future, bandwidth_limiter)
    547         # Determine the size if it was not provided
    548         if transfer_future.meta.size is None:
--> 549             upload_input_manager.provide_transfer_size(transfer_future)
    550 
    551         # Do a multipart upload if needed, otherwise do a regular put object.

~/bitbucket/clguru/env/lib/python3.7/site-packages/s3transfer/upload.py in provide_transfer_size(self, transfer_future)
    324         fileobj.seek(0, 2)
    325         end_position = fileobj.tell()
--> 326         fileobj.seek(start_position)
    327         transfer_future.meta.provide_transfer_size(
    328             end_position - start_position)

/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/zipfile.py in seek(self, offset, whence)
   1023             # Position is before the current position. Reset the ZipExtFile
   1024 
-> 1025             self._fileobj.seek(self._orig_compress_start)
   1026             self._running_crc = self._orig_start_crc
   1027             self._compress_left = self._orig_compress_size

/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/zipfile.py in seek(self, offset, whence)
    702     def seek(self, offset, whence=0):
    703         with self._lock:
--> 704             if self.writing():
    705                 raise ValueError("Can't reposition in the ZIP file while "
    706                         "there is an open writing handle on it. "

AttributeError: '_SharedFile' object has no attribute 'writing'

Если я закомментирую строки после print(obj), чтобы увидеть проверенное содержимое файла zip,

import boto3
import io
import zipfile
import mimetypes

s3 = boto3.resource('s3')
service_zip = io.BytesIO()

service_bucket = s3.Bucket('services.readspeech.com')
build_bucket = s3.Bucket('servicesbuild.readspeech.com')


build_bucket.download_fileobj('servicesbuild.zip', service_zip)

with zipfile.ZipFile(service_zip) as myzip:
    for nm in myzip.namelist():
        obj = myzip.open(nm)
        print(obj)
#        service_bucket.upload_fileobj(obj,nm, 
#                                     ExtraArgs={'ContentType': mimetypes.guess_type(nm)[0]})
#        service_bucket.Object(nm).Acl().put(ACL='public-read')

Я вижу следующее:

<zipfile.ZipExtFile name='favicon.ico' mode='r' compress_type=deflate>
<zipfile.ZipExtFile name='styles/main.css' mode='r' compress_type=deflate>
<zipfile.ZipExtFile name='images/example3.png' mode='r' compress_type=deflate>
<zipfile.ZipExtFile name='images/example1.png' mode='r' compress_type=deflate>
<zipfile.ZipExtFile name='images/example2.png' mode='r' compress_type=deflate>
<zipfile.ZipExtFile name='index.html' mode='r' compress_type=deflate>

1 Ответ

0 голосов
/ 17 октября 2018

Появляется проблема с питоном 3.7.Я понижен до Python 3.6 и все в порядке.В python 3.7

* 1002 сообщается об ошибке. Опечатка в файле lib / zipfile.py в строке 704 приводит к ошибке AttributeError: объект _SharedFile не имеет атрибута «writing»

«self.writing () "следует заменить на" self._writing () ".Я также думаю, что этот код должен быть покрыт тестами.

запись атрибута

Поэтому, чтобы решить эту проблему, используйте python 3.6.На OSX вы можете вернуться к Python 3.6 с помощью следующей команды.

brew switch python 3.6.4_4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...