如何将PyTZ正确添加到Google App Engine应用程序?

时间:2009-11-11 23:07:24

标签: python google-app-engine datetime timezone pytz

这有点令人尴尬,但我无法在这个主题上找到好的资源。

我正在开发需要复杂时区转换的Google App Engine应用程序。由于我没有接近强制配额,我选择了PyTZ。但是,我一定是做错了。到目前为止我所做的是:

  1. 将PyTZ下载为tarball
  2. 安装并复制pytz 目录进入我的应用程序的根目录 (它是webapp的兄弟姐妹 目录,app.yaml所在的目录。)
  3. 但是,如果我尝试实例化时区,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
    ...
    

7 个答案:

答案 0 :(得分:4)

基于问题的标题,我希望(但还没有声誉)推荐jgeewax的答案,因为这是我在搜索时发现这个问题时所使用的。但是,我还要补充一点,按照那里提到的说明,我在github上创建了一个最小的项目,它说明了在app引擎中使用带有压缩的zoneinfo文件的pytz。可能需要30分钟的时间来保存某个实验并在此处运行:http://github.com/mpstx/appengine_py_pytz_zipimport_zoneinfo

答案 1 :(得分:4)

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

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

我欢迎任何反馈。

答案 2 :(得分:3)

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

许多小文件在app引擎中都很麻烦,但修复需要稍微调整才能在 init .py中运行open_resource,以使其从zipfile中获取“资源”而不是尝试每个“资源”打开一个实际的单独文件。这个blog提供了有关如何处理它的更多细节(尤其是评论中的观察结果)。

答案 3 :(得分:2)

我想通了,这比我预想的更令人尴尬。

问题在于(正如我在问题中指出的那样)我使PyTZ成为webapp兄弟。但是,为了让GAE能够加载它,它必须是webapp孩子。这并不是特别令人惊讶,但我预计import pytz会因为问题而失败。

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

答案 4 :(得分:2)

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

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

from pytz.gae import pytz

答案 5 :(得分:1)

pytz现在是built in GAE库。你可以直接导入它。

答案 6 :(得分:0)

我使用了此处找到的第三方指示:https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27

只需将pytz pip安装到lib目录中,然后按照指示添加appengine_config.py文件和内容。

pytz现在已成为Google App Engine lib的一部分: https://cloud.google.com/appengine/docs/standard/python/tools/built-in-libraries-27 我无法正常工作。在app.yaml中,我添加了-名称:pytz和version:最新(也许该版本应该是上述文档中列出的版本)。但这没用。