use*_*852 2 python google-app-engine
我一直在使用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文件中.不幸的是,这不适用于子包.有没有办法做一个修改来解决这个问题?
我的所有第三方库都在一个lib
目录中
我只是包括
sys.path.insert(0,'./lib')
在appengine_config.py中,它在您的任何代码之前加载.
如果你发现它需要在开头sys.path
而不是在最后插入,如果你使用像webob这样不属于appengine可用版本的特定版本的libs.
然后你不必修改任何库等....
这是非常标准的python行为.在正常的桌面安装情况下,你正在安装easy easyinstall,它可以将东西粘贴在诸如站点包和设置路径之类的地方....但是如果你没有使用任何这些,你就不能使用appengine你必须做路径操纵自己.
归档时间: |
|
查看次数: |
577 次 |
最近记录: |