如何在Google App Engine应用中正确添加PyTZ?
这有点尴尬,但我找不到关于这个话题的好资源。
我正在开发一个Google App Engine的应用程序,需要进行复杂的时区转换。因为我还没有达到限制的配额,所以我选择使用PyTZ。不过,我感觉我可能做错了什么。到目前为止,我做了以下几件事:
- 下载了PyTZ的压缩包
- 安装了它,并把
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 个回答
看起来你没有上传完整的 zoneinfo
子目录,这个目录在我手上的 pytz 版本中有 570 个文件和 22 个文件夹。不太清楚为什么会这样——通常情况下,如果这些文件在你的应用目录里,它们应该会被上传。你可以试试用 appcfg.py --verbose update(或者 --noisy)命令,先修改几个文件,然后看看它们是否被上传。
在应用引擎中,很多小文件会带来麻烦,但要解决这个问题,需要对 init.py 中的 open_resource 函数做一点调整,让它从一个压缩文件中获取“资源”,而不是试图为每个“资源”打开一个单独的文件。这个 博客 提供了更多的细节,特别是评论中的一些观察非常有用。
针对这个问题,我采取了不同的方法,创建了一个叫做 pytz-appengine 的项目,而不是使用 gae-pytz
。这个 pytz-appengine 的特别之处在于,它把所有的时区信息都放到了 ndb
数据库里。
pytz 的单元测试都能通过(至少只要上游的测试通过就行)。创建 pytz-appengine 的主要目的是为了让更新时区数据库变得非常简单。它有一个叫 build.py
的构建脚本,可以自动完成这个更新。
欢迎大家提出任何反馈意见。
根据这个问题的标题,我想给jgeewax的回答点个赞(虽然我现在还没有足够的声望)。因为这是我在搜索这个问题时用到的答案。不过,我还想补充一点,按照那里的说明,我在github上创建了一个简单的项目,展示了如何在应用引擎中使用pytz和压缩的zoneinfo文件。这样可能能帮到某人节省30分钟,让实验更快启动。这里是链接: http://github.com/mpstx/appengine_py_pytz_zipimport_zoneinfo