2

我已经使用 AppEngine 一段时间了,并且在使用外部库时总是会遇到一些摩擦,我需要修改每个导入语句以反映该库不在项目的基本目录中的事实。

例如,我的目录结构可能看起来像(安装了 requests 库)

/myapp/app.yaml
/myapp/main.py
/myapp/libraries/requests/packages/
/myapp/libraries/requests/__init__.py
/myapp/libraries/requests/adapters.py
etc...

但是 appengine 期望像

/myapp/app.yaml
/myapp/main.py
/myapp/requests/packages/
/myapp/requests/__init__.py
/myapp/requests/adapters.py
/myapp/requests/api.py
etc...

然后我需要进入每个请求文件以将导入修改为类似

from libraries.requests import adapters

而不是简单的

import adapters

可能在 api.py 中。如果我不修改它,我会收到一个导入错误,例如

ImportError: No module named adapters

我查看了以下如何在 Google App Engine 中导入模块?这建议使用修改路径(尽管应用程序的代码不同)

sys.path.append(os.path.join(os.path.dirname(__file__), 'libraries'))

要将其翻译为我的问题,我可以输入类似

sys.path.append(os.path.dirname(__file__))

在库中每个 __init__.py 文件的开头。但是让我感到震惊的是,必须有一种更有效的方法,并且与 DRY 保持一致——但我似乎找不到它。我尝试将它简单地包含在库中最顶层的 __init__.py 文件中,然后再次包含在每个包中最顶层的 __init__.py 文件中。不幸的是,这不适用于子包。有没有办法做出改变来解决这个问题?

4

1 回答 1

5

我的所有第三方库都在一个lib目录中

我只包括

sys.path.insert(0,'./lib')

在您的任何代码之前加载的 appengine_config.py 中。

sys.path如果您使用不属于 appengine 可用版本的特定版本的库(例如 webob),则需要在开头而不是结尾插入它。

然后你不必修改任何库等......

这是非常标准的 python 行为。在正常的桌面安装情况下,您正在安装 vie easy_install 它将东西粘贴在站点包和设置路径等位置......但是如果您不使用任何这些,并且您不能使用 appengine 你必须做自己操纵路径。

于 2013-08-15T08:28:16.217 回答