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

时间:2021-01-07 07:35:42

This is a little embarrassing, but I have not been able to find good resources on this topic.

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

I'm working on a Google App Engine application that requires sophisticated time zone conversions. Since I am nowhere near the imposed quotas, I have opted to go with PyTZ. However, I must be doing something wrong. What I've done so far is:

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

  1. Downloaded PyTZ as a tarball
  2. 下载PyTZ作为tarball
  3. Installed it and copied the pytz directory into the root of my app (it is a sibling of the webapp directory, where app.yaml is located).
  4. 安装它并将pytz目录复制到我的应用程序的根目录中(它是webapp目录的兄弟,app.yaml所在的位置)。

However, if I try to instantiate timezones, PyTZ can never seem to find any. Here is a sample session from GAE's interactive console:

但是,如果我尝试实例化时区,PyTZ似乎永远不会找到任何时区。以下是GAE交互式控制台的示例会话:

from pytz import timezone

rome = timezone('Europe/Rome')

The output is the following:

输出如下:

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'

What is it I am doing wrong? Thank you in advance for your help.

我做错了什么?预先感谢您的帮助。

NOTE: If I just use the python interactive shell locally things work as expected:

注意:如果我只是在本地使用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>)

Edit: I need to clarify I'm not using a zipped version of PyTZ. I have included the whole zoneinfo directory in my project:

编辑:我需要澄清我没有使用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
...

6 个解决方案

#1


4  

Based on the title of the question, I would like (but don't have the so reputation yet) to vote up jgeewax's answer since it's what I used when I found this question from a search. However, I'll also add that after following the instructions mentioned there, I created a minimal project on github which illustrates using pytz in app engine with the zipped zoneinfo files. Might save someone 30 minutes to get an experiment up and running here: http://github.com/mpstx/appengine_py_pytz_zipimport_zoneinfo

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

#2


4  

In response to this problem, went a different tact from gae-pytz and I created pytz-appengine. In particular pytz-appengine puts all the timezone information into the ndb datastore.

为了回应这个问题,我从gae-pytz那里得到了一个不同的机智,我创造了pytz-appengine。特别是pytz-appengine将所有时区信息放入ndb数据存储区。

The unit tests for pytz pass (at least as long as they pass upstream). The main motivation with pytz-appengine was to make it trivial to update the timezone database on demand. There is a build script build.py that does this automatically.

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

I welcome any feedback on.

我欢迎任何反馈。

#3


3  

Looks like you're not uploading the whole zoneinfo subtree of pytz -- 570 files in 22 directories, in the version of pytz I have at hand. Not sure why -- by default if they're in your app dir they should get uploaded. Try appcfg.py --verbose update (or even --noisy) after touching a few to check if it uploads them

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

Many little files are a bother in app engine, but fixing that requires a little tweak to function open_resource in init.py to make it get the "resource" from inside a zipfile instead of trying to open an actual separate file per "resource". This blog offers more details on how to go about it (esp. useful are the observations in the comments).

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

#4


2  

I figured it out and it was more embarrassing than I anticipated.

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

The problem was that (as I specified in the question) I had made PyTZ a sibling of webapp. However, in order for GAE to be able to load it, it needs to be a child of webapp. This is not terribly surprising, but I expected import pytz to fail had that been the problem.

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

Regardless, moving PyTZ under webapp fixes the issue and the module is still accessible from siblings of webapp (e.g. test).

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

#5


2  

An alternative is to use the packaged version of gae-pytz that includes further optimizations: http://pypi.python.org/pypi/gaepytz

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

You only need the pytz folder in the zipped archive, Using it in your gae project is as easy as:

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

from pytz.gae import pytz

#6


1  

pytz is now a built in GAE library. you can import it directly.

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

#1


4  

Based on the title of the question, I would like (but don't have the so reputation yet) to vote up jgeewax's answer since it's what I used when I found this question from a search. However, I'll also add that after following the instructions mentioned there, I created a minimal project on github which illustrates using pytz in app engine with the zipped zoneinfo files. Might save someone 30 minutes to get an experiment up and running here: http://github.com/mpstx/appengine_py_pytz_zipimport_zoneinfo

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

#2


4  

In response to this problem, went a different tact from gae-pytz and I created pytz-appengine. In particular pytz-appengine puts all the timezone information into the ndb datastore.

为了回应这个问题,我从gae-pytz那里得到了一个不同的机智,我创造了pytz-appengine。特别是pytz-appengine将所有时区信息放入ndb数据存储区。

The unit tests for pytz pass (at least as long as they pass upstream). The main motivation with pytz-appengine was to make it trivial to update the timezone database on demand. There is a build script build.py that does this automatically.

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

I welcome any feedback on.

我欢迎任何反馈。

#3


3  

Looks like you're not uploading the whole zoneinfo subtree of pytz -- 570 files in 22 directories, in the version of pytz I have at hand. Not sure why -- by default if they're in your app dir they should get uploaded. Try appcfg.py --verbose update (or even --noisy) after touching a few to check if it uploads them

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

Many little files are a bother in app engine, but fixing that requires a little tweak to function open_resource in init.py to make it get the "resource" from inside a zipfile instead of trying to open an actual separate file per "resource". This blog offers more details on how to go about it (esp. useful are the observations in the comments).

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

#4


2  

I figured it out and it was more embarrassing than I anticipated.

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

The problem was that (as I specified in the question) I had made PyTZ a sibling of webapp. However, in order for GAE to be able to load it, it needs to be a child of webapp. This is not terribly surprising, but I expected import pytz to fail had that been the problem.

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

Regardless, moving PyTZ under webapp fixes the issue and the module is still accessible from siblings of webapp (e.g. test).

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

#5


2  

An alternative is to use the packaged version of gae-pytz that includes further optimizations: http://pypi.python.org/pypi/gaepytz

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

You only need the pytz folder in the zipped archive, Using it in your gae project is as easy as:

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

from pytz.gae import pytz

#6


1  

pytz is now a built in GAE library. you can import it directly.

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