authentication error in Cloud Datalab: "ImportError: No module named gce”

authentication error in Cloud Datalab: "ImportError: No module named gce”

我和其他人在各种不同的 GCP 项目中遇到过以下问题,并且在几天前相同代码工作的情况下。

我现在正在重新执行所有步骤,以确保我仍然看到相同的内容。我首先删除了我的 GCP 项目中 Cloud Datalab 的 运行ning 实例,然后我重新开始:首先部署 Datalab,然后 "start using" Datalab。

然后我 select 我有一个预先存在的笔记本,它以以下行开头:

!pip install --upgrade google-api-python-client
from httplib2 import Http
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
http = Http()
credentials.authorize(http)

这在过去对我和其他人都有效。现在我得到这个 ImportError:

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-2-deffc94100d1> in <module>()
      1 from httplib2 import Http
      2 from oauth2client.client import GoogleCredentials
----> 3 credentials = GoogleCredentials.get_application_default()
      4 http = Http()
      5 credentials.authorize(http)

/usr/local/lib/python2.7/dist-packages/oauth2client/client.pyc in get_application_default()
   1202         GoogleCredentials.get_application_default().
   1203   
-> 1204         Args:
   1205             access_token: string, access token.
   1206             client_id: string, client identifier.

/usr/local/lib/python2.7/dist-packages/oauth2client/client.pyc in _get_implicit_credentials(cls)
   1187     """
   1188 
-> 1189     NON_SERIALIZED_MEMBERS =  (
   1190         frozenset(['_private_key']) |
   1191         OAuth2Credentials.NON_SERIALIZED_MEMBERS)

/usr/local/lib/python2.7/dist-packages/oauth2client/client.pyc in _implicit_credentials_from_gce()
   1123 
   1124 def _in_gae_environment():
-> 1125     """Detects if the code is running in the App Engine environment.
   1126 
   1127     Returns:

/usr/local/lib/python2.7/dist-packages/oauth2client/client.pyc in _get_application_default_credential_GCE()
   1378         """Get the Application Default Credentials for the current environment.
   1379 
-> 1380         Raises:
   1381             ApplicationDefaultCredentialsError: raised when the credentials
   1382                                                 fail to be retrieved.

ImportError: No module named gce

有什么变化吗?以前名为 "gce" 的模块是否已重命名?我需要创建凭据吗? (该项目有一个默认的 App Engine 服务帐户和一个默认的 Compute Engine 服务帐户,并且已经启用了我认为可能需要启用的所有 API。)

2016 年 4 月 20 日更新:在大约一个月没有尝试重复这个之后,我昨天又看了一遍。我第一次尝试重新 运行 上个月使用的同一个笔记本时,我需要 删除 由于这个问题而添加的修复程序为了让它工作。但是今天,相同的代码将再次失效。与此同时,我注意到建议已经更新,所以我现在将逐步介绍建议的方法。

!pip show google-api-python-client
---
Name: google-api-python-client
Version: 1.5.0
Location: /usr/local/lib/python2.7/dist-packages
Requires: httplib2, uritemplate, six, oauth2client

正在查看 here the specific versions required seem to be: httplib2>=0.8,<1; any oauth2client; six>=1.6.1,<2; and uritemplate>=0.6,<1. (The change to allow earlier oauth2client versions seems to have been committed on Mar 14, but Pypi shows the most recent version as 1.5.0 uploaded on Feb 20, which agrees with the Releases page 说 1.5.0 是在 2 月 19 日发布的,这可能是这个问题最初出现的时候,虽然我有几个星期没有注意到它。)

我无法进一步尝试 Anthonios 描述的 3 个选项,因为我在尝试使用 Datalab 时反复遇到 "Connection failed" 或其他错误。我会尽快尝试再次更新此问题。

您可以在 Datalab 中安装其他 python 库,但必须确保安装不会破坏 Datalab 的工作环境。确保这一点的最佳方法是检查附加 python 库所需的依赖项当前是否安装在 Datalab 中。按照以下步骤操作:

第 1 步:确认您要安装的库需要哪些依赖项

使用!pip show <python library>

例如,使用以下查看 google-api-python-client 所需的依赖项:

>>> !pip show google-api-python-client
---
Name: google-api-python-client
Version: 1.5.0
Location: /usr/local/lib/python2.7/dist-packages
Requires: httplib2, uritemplate, six, oauth2client

所需的具体版本可以找到here

第 2 步:确定 Datalab 中是否已安装任何依赖项

在 Datalab 中,运行 以下代码并检查步骤 1 中的依赖关系

>>> import pip
>>> for dist in pip.get_installed_distributions():
>>>   print dist
GCPData 0.1.0
GCPDataLab 0.1.0
wheel 0.26.0
tensorflow 0.6.0
protobuf 3.0.0a3
nbformat 4.0.1
ipykernel 4.2.2
jsonschema 2.5.1
nose 1.3.7
singledispatch 3.4.0.3
pyparsing 2.0.7
pandas 0.17.1
futures 3.0.3
pyasn1-modules 0.0.8
mock 1.3.0
MarkupSafe 0.23
cycler 0.9.0
ipython 4.0.3
terminado 0.6
path.py 8.1.2
certifi 2015.11.20.1
Pygments 2.1
funcsigs 0.4
backports-abc 0.4
jupyter-client 4.1.1
pexpect 4.0.1
backports.ssl-match-hostname 3.5.0.1
statsmodels 0.6.1
seaborn 0.6.0
scikit-learn 0.16.1
rsa 3.3
jupyter-core 4.0.6
brewer2mpl 1.4.1
py-dateutil 2.2
patsy 0.4.1
ptyprocess 0.5
PyYAML 3.11
Jinja2 2.8
decorator 4.0.6
pandocfilters 1.2.4
pickleshare 0.6
sympy 0.7.6
pytz 2015.7
httplib2 0.9.2
functools32 3.2.3-2
notebook 4.0.2
tornado 4.3
simplegeneric 0.8.1
numpy 1.10.4
matplotlib 1.5.1
scipy 0.17.0
pyasn1 0.1.9
pbr 1.8.1
python-dateutil 2.4.2
traitlets 4.1.0
oauth2client 1.4.12
ipython-genutils 0.1.0
nbconvert 4.1.0
ggplot 0.6.5
mistune 0.7.1

根据本例中的输出,一个冲突是 Datalab 当前安装了 oauth2client 版本 1.4.12,而 google-api-python-client 库需要 oauth2client 版本大于或等于 2.0.0 .

我们有 3 个选项:

  • 等到 Datalab 将对 oauth2client 的支持升级到 >=2.0.0
  • 安装支持 oauth2client 1.4.12 现有安装的先前版本 google-api-python-client。例如,google-api-python-客户端1.4.2
  • 尝试安装最新的 google-api-python-client,同时保持现有的 oauth2client 安装。这可以通过安装没有依赖项的 google-api-python-client 来实现,然后手动安装 Datalab 中尚未安装的任何缺少的依赖项。 (库有可能无法正常工作,但我们不太可能破坏正在工作的 Datalab 环境)。例如:

    !pip install google-api-python-client==1.5.0 --no-deps
    !pip install uritemplate