【问题标题】:Modules paths in PythonPython中的模块路径
【发布时间】:2011-08-04 12:48:59
【问题描述】:

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

【问题讨论】:

  • 您在导入模块之前尝试过sys.path.append(path_to_jinja2) 并没有帮助吗?

标签: python google-app-engine jinja2 pythonpath


【解决方案1】:

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

PYTHONPATH

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

那么你可以简单地做

from jinja2 import WHATEVER

sys.path.append

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

使用虚拟环境

详情会有点长,请关注official doc

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

正确的项目结构和 appcfg.py 的使用应该在上传到 google 时锻炼依赖关系:请查看这个好的答案: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 supportspython 2.5 和 2.7 支持 is experimental

Python 2.7 现在是officially supported

【讨论】:

  • 最后一行不再准确,GAE 现在支持 Python 2.7。
  • @AdamParkin 您有指向此信息的指针吗?我仍然发现他们的文档说官方支持仅适用于 python 2.5。 2.7是实验性的。我已经添加了一个链接。
  • 对不起,你是对的,2.7 是实验性的。我的印象是 2.5 和 2.7 支持是等效的。我的错。话虽如此,我读了评论“还记得GAE官方支持python 2.5(不是2.6或2.7)。”暗示 2.6 或 2.7 不适用于 GAE,这是不正确的(2.7 工作正常,它仍然是“实验性的”,因此需要更改 API)。也许它可以读成“2.5 是唯一官方支持的 Python 版本,尽管 2.7 是实验性支持的”。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多