6

我创建了一个文件夹,其中包含我的 GAE 应用程序的所有模块以及 Jinja2 等外部库,以将所有内容分类在一个地方。我有这样的文件夹结构:

lib\
   \utils\
         \__init__.py
   \firepython
   \jinja2
   \jsonpickle
   __init__.py
   sessions.py

当我尝试从 utils__init__.py 加载 Jinja 时,出现错误ImportError: No module named jinja2.environment。当我查看 Jinja2 导入指令时,我看到它们看起来像from jinja2.loaders. 我尝试将它们更改为类似from lib.jinja2.loaders,但随后会出现有关导入的其他一些错误。不仅如此,如果有更方便和正确的方法来正确导入模块,我认为在外部库源中更改这些导入不是一个好习惯。我还添加了一些路径,PYTHONPATH但它并不能解决所有问题。如何正确导入放置在另一个文件夹中的外部包,可能具有深层结构?

4

2 回答 2

6

实际上,您不必更改外部库中的导入 - 尽管根据您的环境,您甚至可能也有。

蟒蛇路径

修改你的 PYTHONPATH 就足够了;PYTHONPATH 应该包含一个绝对或相对于您家的“lib”路径,例如。

然后你可以简单地做

from jinja2 import WHATEVER

sys.path.append

不使用 PYTHONPATH 的另一种方法是使用sys.path.append()并添加您的 python 代码中的路径。我实际上赞成这一点,因为它还允许拥有每个应用程序的路径。

使用虚拟环境

细节会有点长,但请按照官方文档

这些选项适用于一般的 python 开发而不是 GAE 的特殊性;如果它在您的开发机器上不起作用,您应该发布更多详细信息(精确导入、绝对路径、pythonpath ...)。

上传到 google 时,正确的项目结构和 appcfg.py 的使用应该锻炼依赖关系:请看一下这个很好的答案:如何使用 Google App Engine 管理第三方 Python 库?(virtualenv?pip?)并遵循这些准则。

使用 GAE 的一个好方法是通过 yaml 应用程序指令。请查看包含的文档:http ://code.google.com/appengine/docs/python/config/appconfig.html#Includes

还记得GAE官方支持python 2.5,2.7支持是实验性的

现在正式支持Python 2.7

于 2011-04-13T09:18:48.427 回答
1

要正确导入模块,您需要确保 python 知道在哪里可以找到它。为此,对于每个外部库,将其父目录附加到 sys.path(在运行时),或设置 PYTHONPATH 环境(在运行之前)。

例如:

import sys
sys.path.append('/my/lib')

# now we can import from lib
import jsonpickle # will load /my/lib/jsonpickle/__init__.py

请参阅http://docs.python.org/tutorial/modules.html#the-module-search-path。了解调用 import 时 python 的作用。

于 2011-04-13T09:19:02.430 回答