我一直在使用AppEngine一段时间并且在使用外部库时总是有一些摩擦,我需要修改每个import语句以反映库不在项目的基本目录中的事实.
例如,我的目录结构可能看起来像(安装了请求库)
/myapp/app.yaml
/myapp/main.py
/myapp/libraries/requests/packages/
/myapp/libraries/requests/__init__.py
/myapp/libraries/requests/adapters.py
etc...
Run Code Online (Sandbox Code Playgroud)
然而,appengine期待类似的东西
/myapp/app.yaml
/myapp/main.py
/myapp/requests/packages/
/myapp/requests/__init__.py
/myapp/requests/adapters.py
/myapp/requests/api.py
etc...
Run Code Online (Sandbox Code Playgroud)
然后我需要进入每个请求文件来修改导入类似的东西
from libraries.requests import adapters
Run Code Online (Sandbox Code Playgroud)
而不是简单
import adapters
Run Code Online (Sandbox Code Playgroud)
可能在api.py内.如果我不修改它,我会收到导入错误,例如
ImportError: No module named adapters
Run Code Online (Sandbox Code Playgroud)
我看过以下如何在Google App Engine中导入模块?这建议使用修改路径(虽然应用程序的代码不同)
sys.path.append(os.path.join(os.path.dirname(__file__), 'libraries'))
Run Code Online (Sandbox Code Playgroud)
要将此翻译成我的问题,我可以提出类似的内容
sys.path.append(os.path.dirname(__file__))
Run Code Online (Sandbox Code Playgroud)
在库中的每个__init__.py文件的开头.然而,令我感到震惊的是,必须有一种更有效的方式,并且与DRY保持一致 - 但我似乎无法找到它.我已经尝试过将它简单地包含在库中最顶层的__init__.py文件中,然后再添加到每个包中最顶层的__init__.py文件中.不幸的是,这不适用于子包.有没有办法做一个修改来解决这个问题?