spe*_*ane 8 python google-app-engine virtualenv python-import google-cloud-platform
我想在一个应用程序中使用两个Python库(Google的Cloud Library及其Cloud SDK),但它们具有冲突的名称(它们都google在其基本导入名称中使用,并且不在内部使用相对导入).我怎样才能在一个应用程序中使用它们?
更改库的代码以使用正确的相对导入是不切实际的.另外,我知道我可以使用virtualenv从不同的python应用程序访问这些库,但是如何从同一个python应用程序中访问它们?
以下是导入的一些细节.当我从云库(我运行import google.cloud.datastore)导入模块时,该库中的另一个导入有一个例外:
>>> import libs.google.cloud.datastore
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\[ProjectDIR]\libs\google\cloud\datastore\__init__.py", line 52, in <module>
from google.cloud.datastore.batch import Batch
ImportError: No module named cloud.datastore.batch
Run Code Online (Sandbox Code Playgroud)
图书馆试图进行绝对导入,而不是相对导入.Google Cloud Library无法导入google.cloud.datastore.batch的原因google是因为已在SDK中定义,因此存在命名冲突:
>>> print google.__path__
['C:\\Program Files (x86)\\Google\\Cloud SDK\\google-cloud-sdk\\platform\\google_appengine\\google']
Run Code Online (Sandbox Code Playgroud)
由于Cloud Library使用绝对导入,并且该名称google已在SDK中定义,因此导入失败.
这些google包注意将自己注册为命名空间包.通过适当的设置,sys.path这里没有冲突.
您需要正确设置库环境.使用以下appengine_config.py命令在项目的根目录中添加文件:
from google.appengine.ext import vendor
# Add any libraries installed in the "lib" folder.
vendor.add('lib')
Run Code Online (Sandbox Code Playgroud)
这会将lib子目录添加到正确的位置sys.path.请参阅" 在App Engine上开发Python应用程序"中的" 安装第三方库"部分.
从这里开始进口google.cloud 正常工作:
$ ls -1d lib *.py *.yaml
app.yaml
appengine_config.py
lib
main.py
$ pip install -t lib google-cloud
# installing into the lib subdirectory
$ cat main.py
import google
from google.cloud import datastore
from google.appengine.api import memcache
import os.path
here = os.path.dirname(os.path.abspath(__file__))
def app(*args, **kwargs):
return '''
google: {}<br />
google.cloud.datastore: {}<br />
google.appengine.api.memcache: {}'''.format(
os.path.relpath(google.__file__, here),
os.path.relpath(datastore.__file__, here),
os.path.relpath(memcache.__file__, here))
Run Code Online (Sandbox Code Playgroud)
在浏览器中我服务:
google: ../google-cloud-sdk/platform/google_appengine/google/__init__.py
google.cloud.datastore: lib/google/cloud/datastore/__init__.pyc
google.appengine.api.memcache: ../google-cloud-sdk/platform/google_appengine/google/appengine/api/memcache/__init__.pyc
Run Code Online (Sandbox Code Playgroud)