Как правильно добавить PyTZ в приложение Google App Engine? - PullRequest
3 голосов
/ 12 ноября 2009

Это немного смущает, но я не смог найти хороших ресурсов по этой теме.

Я работаю над приложением Google App Engine, которое требует сложных преобразований часовых поясов. Поскольку я не нахожусь рядом с введенными квотами, я решил пойти с PyTZ. Тем не менее, я должен делать что-то не так. Что я сделал до сих пор:

  1. Загруженный PyTZ как тарбол
  2. Установил и скопировал pytz каталог в корне моего приложения (это брат webapp каталог, в котором находится app.yaml).

Однако, если я попытаюсь создать временные зоны, PyTZ никогда не сможет их найти. Вот пример сеанса с интерактивной консоли GAE:

from pytz import timezone

rome = timezone('Europe/Rome')

Вывод следующий:

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/admin/__init__.py", line 210, in post
    exec(compiled_code, globals())
  File "<string>", line 3, in <module>
  File "/Library/Python/2.5/site-packages/pytz-2009j-py2.5.egg/pytz/__init__.py", line 157, in timezone
UnknownTimeZoneError: 'Europe/Rome'

Что я делаю не так? Заранее благодарю за помощь.

ПРИМЕЧАНИЕ : Если я просто использую интерактивную оболочку python локально, все работает как положено:

>>> from pytz import datetime, timezone
>>> rome = timezone('Europe/Rome')
>>> rome.localize(datetime.datetime.now())
datetime.datetime(2009, 11, 12, 0, 4, 52, 990114, tzinfo=<DstTzInfo 'Europe/Rome' CET+1:00:00 STD>)

Редактировать : Мне нужно уточнить, я не использую версию PyTZ в архиве. Я включил в свой проект весь каталог zoneinfo:

pc-morena:pytz lyudmilangelov$ cd zoneinfo/
pc-morena:zoneinfo lyudmilangelov$ ls -l
total 448
drwxr-xr-x@  55 lyudmilangelov  staff   1870 Nov 10 12:48 Africa
drwxr-xr-x@ 135 lyudmilangelov  staff   4590 Nov 10 12:48 America
drwxr-xr-x@  12 lyudmilangelov  staff    408 Nov 10 12:48 Antarctica
drwxr-xr-x@   3 lyudmilangelov  staff    102 Nov 10 12:48 Arctic
drwxr-xr-x@  93 lyudmilangelov  staff   3162 Nov 10 12:48 Asia
...

Ответы [ 7 ]

4 голосов
/ 18 марта 2013

В ответ на эту проблему пошёл другой такт, нежели gae-pytz, и я создал pytz-appengine . В частности, pytz-appengine помещает всю информацию о часовых поясах в хранилище данных ndb.

Юнит-тесты для прохождения pytz (по крайней мере, пока они проходят вверх по течению). Основной мотивацией pytz-appengine было сделать тривиальным обновление базы данных часовых поясов по требованию. Существует скрипт сборки build.py, который делает это автоматически.

Я приветствую любые отзывы.

4 голосов
/ 12 декабря 2009

Исходя из названия вопроса, я хотел бы (но пока не имею такой репутации) проголосовать за ответ jgeewax, поскольку именно это я и использовал, когда нашел этот вопрос из поиска. Тем не менее, я также добавлю, что после следования указанным там инструкциям я создал минимальный проект на github, который иллюстрирует использование pytz в движке приложения с заархивированными файлами zoneinfo. Можете сэкономить кому-то 30 минут, чтобы начать эксперимент здесь: http://github.com/mpstx/appengine_py_pytz_zipimport_zoneinfo

3 голосов
/ 12 ноября 2009

Похоже, вы не загружаете целое поддерево zoneinfo из pytz - 570 файлов в 22 каталогах, в той версии pytz, которая у меня под рукой. Не уверен почему - по умолчанию, если они находятся в директории вашего приложения, они должны быть загружены. Попробуйте appcfg.py --verbose update (или даже --noisy) после касания нескольких, чтобы проверить, загружает ли он их

Многие маленькие файлы бесполезны в движке приложения, но исправление, которое требует небольшой настройки для работы open_resource в init .py, чтобы он получал «ресурс» из zip-файла вместо попытки открыть фактический отдельный файл на «ресурс». Этот блог предлагает более подробную информацию о том, как это сделать (особенно полезны замечания в комментариях).

2 голосов
/ 18 августа 2010

Альтернативой является использование упакованной версии gae-pytz, которая включает в себя дальнейшую оптимизацию: http://pypi.python.org/pypi/gaepytz

Вам нужна только папка pytz в архиве, Использовать его в вашем gae проекте так же просто, как:

from pytz.gae import pytz
2 голосов
/ 12 ноября 2009

Я понял это, и это было более неловко, чем я ожидал.

Проблема заключалась в том, что (как я указал в вопросе) я сделал PyTZ родным из webapp. Однако, чтобы GAE мог загрузить его, он должен быть child of webapp. Это не очень удивительно, но я ожидал, что import pytz потерпит неудачу, если бы это была проблема.

Несмотря на это, перемещение PyTZ под webapp устраняет проблему, и модуль все еще доступен от братьев или сестер webapp (например, test).

1 голос
/ 20 сентября 2017

pytz теперь является встроенной библиотекой GAE. Вы можете импортировать его напрямую.

0 голосов
/ 01 августа 2018

Я использовал сторонние инструкции, найденные здесь: https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27

Просто вставьте pytz install в каталог lib, добавьте файл appengine_config.py и его содержимое в соответствии с инструкциями.

Хотя pytz теперь является частью библиотеки Google App Engine: https://cloud.google.com/appengine/docs/standard/python/tools/built-in-libraries-27 Я не мог заставить его работать. В app.yaml я добавил - имя: pytz и версия: последняя (возможно, версия должна была быть указана в вышеупомянутом документе). Но это не сработало.

...