这有点令人尴尬,但我无法在这个主题上找到好的资源。
我正在开发需要复杂时区转换的Google App Engine应用程序。由于我没有接近强制配额,我选择了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交互式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
...
答案 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:最新(也许该版本应该是上述文档中列出的版本)。但这没用。