2016-10-14 2 views
0

Это мой скрипт python, который загружает самое последнее изображение из моего ведра S3. Когда я запускаю этот скрипт, используя sudo python script.py, он делает так, как ожидалось, , но не тогда, когда я запускаю его как python script.py. В этом случае скрипт завершается чисто без исключений или блокировки процесса, но нет файла изображения.скрипт python не работает без sudo - почему?

Почему это происходит? Есть ли что-то, что я мог бы сделать на стороне библиотеки boto или любой другой вещи?

import boto 
import logging 


def s3_download(): 
    bucket_name = 'cloudadic' 
    conn = boto.connect_s3('XXXXXX', 'YYYYYYY') 
    bucket = conn.get_bucket(bucket_name) 

    for key in bucket.list('ocr/uploads'): 
     try: 
      l = [(k.last_modified, k) for k in bucket] 
      key = sorted(l, cmp=lambda x, y: cmp(x[0], y[0]))[-1][1] 
      res = key.get_contents_to_filename(key.name) 
     except: 
      logging.info(key.name + ":" + "FAILED") 

if __name__ == "__main__": 
    s3_download() 
+2

Что означает «не работает»? И почему мне даже нужно все это просить? –

+0

не работает означает, что он не загружает изображение – Guru

+4

У вас есть исключение? Вы получаете файл нулевой длины? Заблокирован ли процесс? ЧТО ЭТО ЗНАЧИТ? –

ответ

1

Как @Nearoo в комментариях предложил использовать except Exception as inst, чтобы поймать исключения.

отлов исключения, как этот

except Exception as inst: 
      print(type(inst)) 
      print(inst.args) 
      print(inst) 

Если принести вам эту ошибку, если сценарий компилируется с помощью питона 3x Если бы скомпилировать скрипт с помощью Python 2.7, эта ошибка не придет.

Возможно, вы могли бы иметь несколько версий питона на вашей системе, , которые должны быть причиной для разницы в поведении python script.py и sudo python script.py и тот же @mootmoot ответ предлагает использовать virtualenv

'cmp' is an invalid keyword argument for this function.

Теперь, если бы у вас была ошибка в этой ошибке, вы должны обнаружить, что cmp устарел в python 3x, и вместо этого следует использовать key.

добавить эти импорт

import functools 
from functools import cmp_to_key 

и заменяющие с этими

key2 = sorted(l, key = cmp_to_key(lambda x,y: (x[0] > y[0]) - (x[0] < y[0])))[-1][1] 
res = key2.get_contents_to_filename(key2.name) 

(x[0] > y[0]) - (x[0] < y[0]) является заместитель cmp(x[0], y[0])

cmp заменяется key и cmp_to_key используется от functools lib

Check this out

+0

Спасибо, что он сработал. На самом деле я работал над openCV lib, так что установлен Anaconda, который установил другую версию python – Guru

+0

@Guru: В таком случае вам нужно установить 'conda' для Anaconda, чтобы включить вашу виртуальную среду. Поскольку многие пакеты под 'conda install' не обновлены, в нем нет четких адатов, использующих' conda' vs 'virtualenv' для тех, кто не использует Anaconda. http://kylepurdon.com/blog/using-continuum-analytics-conda-as-a-replacement-for-virtualenv-pyenv-and-more.html – mootmoot

+0

да, я делаю это – x0v

1

Предположительно проблема заключается в том, что вы пытаетесь хранить вещи, в которых у вашего пользователя нет разрешения. Вторая проблема заключается в том, что ваш скрипт скрывает ошибку. Блок except полностью игнорирует, какие исключения происходят (и, конечно, потребляет их, чтобы вы их никогда не видели), и использует logging.info, который по умолчанию не отображается; вероятно, должно быть, по крайней мере, предупреждение, и было бы лучше, если бы оно показало что-то о том, что пошло не так. Кстати, скорее всего, вы не должны размещать здесь ключи аутентификации S3.

+0

, который не должен быть проблемой разрешения каталогов, я уже сделал «chmod -R 777», и они не являются действительными ключом проверки подлинности S3 для обработки исключений. Я трюк, но как узнать, какое исключение происходит? I – Guru

+0

Если вы не поймаете исключение, оно прекратит выполнение сценария и создаст трассировку стека. Если вы хотите продолжать работать, вызов [traceback.print_exc] (https://docs.python.org/3/library/traceback.html#traceback.print_exc) в вашем блоке исключает печать той же трассировки для вас, но чтобы сценарий продолжался. Сообщение о регистрации может отображаться либо с увеличением степени серьезности (используйте 'warning', а не' info') или [настраивать ведение журнала] (https://docs.python.org/2/howto/logging.html#configuring-logging), чтобы быть более подробным. –

0

Перед началом разработки в python всегда устанавливайте virtual environment.

Проблема, с которой вы сталкиваетесь, является типичной проблемой новичка python: используйте sudo для установки всего пакета pypi.

Когда вы сделаете sudo pip install boto3, он установит пакет pypi в рабочую область системы и будет доступен только sudo. В таком случае sudo python script.py будет работать, поскольку он имеет права доступа к пакету.

Чтобы решить эти проблемы и изолировать среду разработки (чтобы вы не загрязняли разные проекты с помощью пакета differnt pypi), разработчик python установит виртуальную среду python (сверху ссылку), затем используйте mkvirtualenv для создания рабочего пространства проекта, запустите pip install и python setup.py install, чтобы установить необходимый пакет в среду, затем вы можете запустить python без sudo python.

Python virtualenv также развертывается внутри производственной среды по той же причине.

Важное примечание: избегать boto и boto2. AWS больше не поддерживает их и не исправляет ошибку (AWS официально не поддерживает boto2, используйте его на свой страх и риск). Переключитесь на boto3.


Для исключительных проблем с обработкой, это сказал Янн Вернье. И ошибка исключения не регистрируется logging.info. Вы можете попробовать с logging.debug или просто использовать raise, чтобы поднять фактическую ошибку исключения.

+0

Ваши предложения были очень проницательными, спасибо – Guru

Смежные вопросы