我已经为我的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
的路径,但它并没有解决所有问题。如何正确导入放置在另一个文件夹中的外部包,可能具有深层结构?
答案 0 :(得分:6)
事实上,您不必更改外部库中的导入 - 尽管取决于您的环境,您甚至可能也有。
修改你的PYTHONPATH应该足够了; PYTHONPATH应该包含一个'lib'路径,它是绝对的或相对于你的家,例如。
然后你可以简单地做
from jinja2 import WHATEVER
没有PYTHONPATH的另一种方法是使用sys.path.append()
并从python代码中添加路径。我实际上赞成这一点,因为它也允许每个应用程序路径。
详细信息可能会有点长,但请遵循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时的作用。