3

这有点尴尬,但我一直没能找到关于这个主题的好资源。

我正在开发一个需要复杂时区转换的 Google App Engine 应用程序。由于我离强加的配额还差得很远,所以我选择了 PyTZ。但是,我一定做错了什么。到目前为止我所做的是:

  1. 下载 PyTZ 作为 tarball
  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 交互式 shell,事情会按预期工作:

>>> 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
...
4

7 回答 7

4

根据问题的标题,我想(但还没有那么好的声誉)投票赞成 jgeewax 的答案,因为这是我在搜索中找到这个问题时使用的。但是,我还要补充一点,在按照那里提到的说明进行操作后,我在 github 上创建了一个最小项目,该项目说明了在应用程序引擎中使用 pytz 和压缩的 zoneinfo 文件。可能会节省 30 分钟的时间来在这里启动和运行实验:http: //github.com/mpstx/appengine_py_pytz_zipimport_zoneinfo

于 2009-12-11T21:48:13.400 回答
4

为了解决这个问题,我采取了不同的策略gae-pytz,我创建了pytz-appengine。特别是 pytz-appengine 将所有时区信息放入ndb数据存储区。

pytz 的单元测试通过(至少只要它们通过上游)。pytz-appengine 的主要动机是让按需更新时区数据库变得简单。有一个构建脚本build.py可以自动执行此操作。

我欢迎任何反馈。

于 2013-03-18T19:48:23.690 回答
3

看起来你没有上传 22 个目录中的 570 个文件的整个zoneinfo子树pytz,在我手头的 pytz 版本中。不知道为什么——默认情况下,如果它们在您的应用程序目录中,它们应该被上传。触摸一些后尝试 appcfg.py --verbose update(甚至 --noisy)以检查它是否上传它们

许多小文件在应用程序引擎中是一个麻烦,但修复需要稍微调整以在init .py 中运行 open_resource 以使其从 zipfile 中获取“资源”,而不是尝试为每个“资源”打开一个实际的单独文件。这个博客提供了更多关于如何去做的细节(尤其有用的是评论中的观察)。

于 2009-11-12T00:45:42.530 回答
2

另一种方法是使用包含进一步优化的 gae-pytz 打包版本:http: //pypi.python.org/pypi/gaepytz

您只需要压缩存档中的 pytz 文件夹,在您的 gae 项目中使用它就像:

from pytz.gae import pytz
于 2010-08-18T15:00:22.520 回答
2

我想通了,这比我预期的要尴尬。

问题是(正如我在问题中指定的那样)我已将 PyTZ设为. 但是,为了让GAEwebapp能够加载它,它需要是. 这并不令人惊讶,但如果这是问题所在,我预计会失败。webappimport pytz

无论如何,将 PyTZ 移到下webapp可以解决问题,并且仍然可以从webapp(例如test)的兄弟姐妹访问该模块。

于 2009-11-12T02:12:50.293 回答
1

pytz 现在是一个内置的GAE 库。你可以直接导入。

于 2017-09-19T23:17:20.570 回答
0

我使用了此处的第 3 方说明:https ://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27

只需将 pip install pytz 放入 lib 目录,按照说明添加 appengine_config.py 文件和内容。

虽然 pytz 现在是 Google App Engine 库的一部分: https ://cloud.google.com/appengine/docs/standard/python/tools/built-in-libraries-27 我无法让它工作。在 app.yaml 中,我添加了 - name: pytz 和 version: latest (也许版本应该是上面文档中列出的版本)。但它没有用。

于 2018-08-01T19:36:25.287 回答