Python中的模块路径

时间:2011-04-13 08:48:47

标签: python google-app-engine jinja2 pythonpath

我已经为我的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的路径,但它并没有解决所有问题。如何正确导入放置在另一个文件夹中的外部包,可能具有深层结构?

2 个答案:

答案 0 :(得分:6)

事实上,您不必更改外部库中的导入 - 尽管取决于您的环境,您甚至可能也有。

PYTHONPATH

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

然后你可以简单地做

from jinja2 import WHATEVER

sys.path.append

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

使用virtualenv

详细信息可能会有点长,但请遵循official doc

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

在上传到谷歌时,正确的项目结构和appcfg.py的使用应该是锻炼依赖:请看一下这个好答案:How do I manage third-party Python libraries with Google App Engine? (virtualenv? pip?)并遵循这些准则。

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

还记得GAE officially supports python 2.5和2.7支持is experimental

Python 2.7现在是officially supported

答案 1 :(得分: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。了解python在调用import时的作用。