【发布时间】:2017-05-14 22:27:33
【问题描述】:
我想在一个应用程序中使用两个 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.datastore.batch的原因是SDK中已经定义了google,存在命名冲突:
>>> print google.__path__
['C:\\Program Files (x86)\\Google\\Cloud SDK\\google-cloud-sdk\\platform\\google_appengine\\google']
由于云库使用绝对导入,并且SDK中已经定义了名称google,所以导入失败。
【问题讨论】:
-
第二个链接去谷歌应用引擎SDK(在
google.appengine包下提供代码),第一个是google.cloud。我不明白这两者的名字是如何冲突的。您遇到什么问题?您可以随时以不同的名称导入模块;from google.cloud import datastore as gc_datastore将绑定名称gc_datastore在您当前的模块中;原来的名字是什么并不重要。 -
嗨@MartijnPieters,问题与库的内部结构有关。第一个链接的库不使用相对导入,因此当您尝试导入它时,您会遇到与第二个链接的命名冲突。请参阅此处的第 57 行:github.com/GoogleCloudPlatform/google-cloud-python/blob/master/…
-
那么另一个实际上是否包含
google.cloud.datastore包?你没有明确地与那里的任何东西联系起来。而且我怀疑 Google App Engine SDK 已经包含 Cloud SDK 作为安装的一部分,因此您不需要安装另一个。 -
@MartijnPieters,我添加了更多细节。问题是两个库都定义了
google,而云库使用绝对导入。不,SDK 不包含云库。 Cloud Libraries 是访问使用 REST 接口的 Cloud 资源的更新方式。 -
你为什么在这个路径中使用
libs:import libs.google.cloud.datastore?为什么不是顶级安装呢?那是你的真正的问题。
标签: python google-app-engine virtualenv google-cloud-platform python-import