Python中的模块路径

Python中的模块路径,python,google-app-engine,jinja2,pythonpath,Python,Google App Engine,Jinja2,Pythonpath,我已经为我的GAE应用程序创建了一个包含所有模块的文件夹,并使用了外部库(如Jinja2)将所有内容排序在一个地方。我的文件夹结构如下: lib\ \utils\ \__init__.py \firepython \jinja2 \jsonpickle __init__.py sessions.py 当我试图从utils\uuu init\uuuu.py加载Jinja时,我得到错误ImportError:没有名为jinja2.environ

我已经为我的GAE应用程序创建了一个包含所有模块的文件夹,并使用了外部库(如Jinja2)将所有内容排序在一个地方。我的文件夹结构如下:

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

当我试图从utils\uuu init\uuuu.py加载Jinja时,我得到错误
ImportError:没有名为jinja2.environment的模块。当我查看Jinja2导入指令时,我看到它们看起来像来自Jinja2.loaders的
。我试图将它们更改为lib.jinja2.loaders中的
,但在导入时会出现一些其他错误。除此之外,如果有更方便、正确的方法正确导入模块,我认为在外部源代码库中更改这些导入不是一个好的做法。我还为
PYTHONPATH
添加了一些路径,但它并不能解决所有问题。如何正确导入放置在另一个文件夹中的外部包(可能具有深层结构)?

确实,您不必更改外部库中的导入-尽管根据您的环境,您甚至可能也需要更改导入

蟒蛇 修改PYTHONPATH就足够了;PYTHONPATH应该包含一个“lib”路径,该路径可以是绝对路径,也可以是相对于您的家的路径,例如

然后你可以简单地做

from jinja2 import WHATEVER
sys.path.append 另一种不用PYTHONPATH的方法是使用
sys.path.append()
并从python代码中添加路径。事实上,我很赞成这样做,因为它还允许每个应用程序都有路径

使用virtualenv 这里的细节可能有点长,但请按照

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

当上传到google时,一个合适的项目结构和appcfg.py的使用应该解决依赖关系:请看看这个好答案:并遵循这些指导原则

使用GAE的一个好方法是通过yaml应用程序指令。请查看文档,了解以下内容:

还要记住GAE python 2.5和2.7支持


Python 2.7现在是

要正确导入模块,您需要确保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

看。为了理解python在调用导入时的作用。

在导入模块之前是否尝试过
sys.path.append(path\u to\u jinja2)
,但没有帮助?最后一行不再准确,python 2.7现在受GAE支持。@AdamParkin您有指向此信息的指针吗?我仍然发现他们的文档说官方只支持python 2.5。2.7是实验性的。我添加了一个链接。对不起,你是对的,2.7是实验性的。我的印象是2.5和2.7支持是等效的。我的错误。话虽如此,我还是读到了评论“还记得GAE正式支持Python2.5(不是2.6或2.7)。”这意味着2.6或2.7不能与GAE一起工作,这是不正确的(2.7工作很好,只是仍然是“实验性的”,所以可能会更改API)。也许可以这样理解:“2.5是唯一官方支持的Python版本,尽管2.7是实验支持的”。