我已经使用 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 文件中。不幸的是,这不适用于子包。有没有办法做出改变来解决这个问题?