我想在一个应用程序中使用两个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
图书馆试图进行绝对导入,而不是相对导入。 Google Cloud Library无法导入google.cloud.datastore.batch
的原因是因为SDK中已定义google
,因此存在命名冲突:
>>> print google.__path__
['C:\\Program Files (x86)\\Google\\Cloud SDK\\google-cloud-sdk\\platform\\google_appengine\\google']
由于Cloud Library使用绝对导入,并且SDK中已定义了名称google
,因此导入失败。
答案 0 :(得分:7)
google
包注意将自己注册为名称空间包。如果设置正确sys.path
,则此处没有冲突。
您需要正确设置库环境。使用以下命令在项目的根目录中添加appengine_config.py
文件:
from google.appengine.ext import vendor
# Add any libraries installed in the "lib" folder.
vendor.add('lib')
这会在lib
的正确位置添加sys.path
子目录。请参阅在App Engine上开发Python应用程序操作方法中的Installing a third-party library section。
从此处开始导入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))
并在浏览器中提供服务:
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