为什么我的Python App Engine应用程序使用Translate API时会出现ImportError: No module named apiclient.discovery错误?

179

我在使用 Google App Engine Python 时遇到了这个错误,已经使用了 Google Translate API, 但我不知道该如何修复。

<module>
from apiclient.discovery import build
ImportError: No module named apiclient.discovery

我会尝试设置环境,指定到Google App Engine SDK,然后再次上传到Google Apps Engine,总是遇到错误

错误:服务器错误

服务器遇到错误,无法完成您的请求。 如果问题仍然存在,请报告您的问题,并提及此错误消息和引起该错误的查询。

请告诉我如何修复,

谢谢

更新:已解决 按照Nijjin的帮助, 我通过添加以下文件夹来解决问题:

apiclient、gflags、httplib2、oauth2client、uritemplate

如果您仍然遇到问题,请考虑查看本页面下方的答案以获取更多信息。例如:Varum的回答等...


дЅ ењЁдЅ зљ„appengineйЎ№з›®дё­еЊ…еђ«дє†apiclientд»Јз Ѓз›®еЅ•еђ—пјџ - Nijin Narayanan
你是指外部库吗?(是 /Google App Engine SDK/ google-api-python-client/apiclient/discovery.py 吗?)我使用的是 IDEA IntelliJ。感谢您提供更多信息。 - Huy Tower
1
请确保您不是以sudo身份运行程序,因为pip会在用户主目录下安装库,这样根用户就没有这些库了。请执行命令pip show PyDrive来检查是否已正确安装PyDrive库。 - deFreitas
https://cloud.google.com/sdk/docs/ 可能有助于该过程。 - XoXo
这是我第一次访问的页面,但最初错过了Nijin和Varun下面的答案。您需要按照链接中的说明将模块作为“第三方包”包含在应用程序工作目录中。在Linux Ubuntu上,当使用-t开关安装到lib/时,我还必须使用sudo。 - alchemy
20个回答

282

你应该能够通过这个简单的安装来获取这些依赖:

sudo pip install --upgrade google-api-python-client

这在Python快速入门页面上有描述。


7
我刚刚做完这个,遇到了同样的错误。我使用了以下命令进行安装:C:\>C:\Python27\Scripts\easy_install-script.py --upgrade google-api-python-client,它显示了 Installed c:\python27\lib\site-packages\google_api_python_client-1.3.1-py2.7.egg。尝试重新安装时,出现了 google-api-python-client 1.3.1 is already the active version in easy-install.pth 的信息。 - Edmund Sulzanok
5
答案中提供的链接已移动到Google Python入门 - Nathan
4
我不知道为什么上述命令没有使用sudo也可以运行。 - mtk
6
针对Python 3,上述命令中需要将pip替换为pip3。我相信这可能不是很明显。 - Emmet B
2
使用 Debian 9 Stretch,我使用了以下命令:sudo apt-get install python-googleapi python-oauth2clientsudo apt-get install python3-googleapi python3-oauth2client。它们都可以完美运行,而且我更喜欢这种方式,因为一个软件包管理器已经足够了。 - Unix
在使用pip时,使用sudo是一种不好的做法,而且可能非常危险。如果不需要sudo,请不要使用它。 - Charming Robot

173

apiclient 是该库的原始名称。
后来,它被改为 googleapiclient

如果您的代码正在 Google App Engine 上运行,两者都可以工作。

如果您自己运行应用程序,并安装了google-api-python-client,那么两者也应该都可以工作。

但是,如果我们查看 apiclient 包的 __init__.py 模块的源代码,我们可以看到 apiclient 模块只是为了向后兼容而保留下来的。

将 apiclient 保留为 googleapiclient 的别名。

因此,在您的代码中,确实应该使用 googleapiclient,因为 apiclient 别名只是为了不破坏旧代码。

# bad
from apiclient.discovery import build

# good
from googleapiclient.discovery import build

更多信息:我刚遇到了这个问题(Python 3.5.2),将“import”语句中的名称更改后,问题得以解决。我将 Google 的示例代码移动到 PyCharm 中的一个文件中,当 PyCharm 提示我安装名为“apiclient”的包时,我便进行了安装。然而实际上,我所安装的模块很小,看起来并不与 Google 相关。 - Nathan Wailes
这对我来说是解决方案。我已经在Python 2中使用apiclient有一段时间了,刚刚在Pycharm中创建了一个新项目(将所有新项目转移到Python3),只需从apliclient更改为googleapliclient(确保已安装)即可修复并允许我的基本模板框架进行报告。谢谢。 - James

11
如果以上解决方案都无法解决问题,请考虑是否通过Anaconda安装了Python。如果是这种情况,那么使用conda安装Google API库可能会解决问题。
运行:
python --version

如果您遇到类似如下的问题:

Python 3.6.4 :: Anaconda, Inc.

那么尝试:

conda install google-api-python-client

正如bgoodr在评论中指出的那样,您可能需要指定通道(即存储库)才能获取谷歌API库。撰写本文时,这意味着运行以下命令:

As bgoodr已经在评论中指出,您可能需要指定通道(即存储库)来获取谷歌API库。撰写本文时,这意味着运行以下命令:

conda install -c conda-forge google-api-python-client

更多内容请参见https://anaconda.org/conda-forge/google-api-python-client


3
看起来需要一个频道。请参见 https://anaconda.org/conda-forge/google-api-python-client (请参见 -c 选项)。 - bgoodr
2
谢谢@bgoodr。我已经在答案中加入了您的评论。 - Jonathan Hansen
提供了通道后,它完美地工作了。谢谢! - Brookie_C
使用带有版本标志的Python命令未能启动“Anaconda”,但我的VS Code环境已设置为Conda。我使用带有-c参数的conda install命令,它起作用了。谢谢。 - Dave Sottimano

10

apiclient 并未在 appengine runtime 提供的第三方库列表中: http://developers.google.com/appengine/docs/python/tools/libraries27

您需要将 apiclient 复制到您的项目目录中,您还需要复制这些 uritemplatehttplib2

注意: 任何未在文档列表中提供的第三方库都必须复制到您的 appengine 项目目录中。


1
我使用了Google Translate API的Python,因此我需要:apiclient、gflags、httplib2、oauth2client、uritemplate。谢谢:D - Huy Tower
Jorvis的回复更适用于那些没有运行应用程序的人。如果我说错了,请纠正我。 - Outlier
这是真的吗,apiclient没有包含在默认库中?我们可以在PyCharm中看到apiclient作为Google App Engine SDK目录中列出的一个目录。尽管如此,即使我们在那里看到它,我们仍然会遇到这个问题中的错误。 - Praxiteles

8
我通过重新安装包来解决了这个问题,具体操作如下:
pip install --force-reinstall google-api-python-client

1
除了这一个,没有任何东西对我有用! - Aditya Rajgor

7

请确保您只安装了google-api-python-client。如果您安装了apiclient,将会导致冲突。因此,请运行以下命令:

sudo pip uninstall apiclient

6

对于应用引擎项目,您需要在本地安装lib。请键入以下命令进行安装:

pip install -t lib google-api-python-client

点击此处查看更多相关的it技术内容。


这让我开始工作了,尽管我还必须遵循这里的答案将lib目录添加为供应商:https://dev59.com/JWUq5IYBdhLWcg3wBL_j#29681061 - kevinmicke

5

对于Python3,以下方法适用:

sudo pip3 install --upgrade google-api-python-client

5

Google API Python客户端库提供了一个下载,包含库及其所有依赖项,名称类似于google-api-python-client-gae-<version>.zip,可以在项目的下载部分找到。只需将其解压缩到您的App Engine项目中即可。


4

我在一个解析Google日历最近事件的项目中遇到了同样的错误。

使用标准安装pip时,对我无效。以下是我获取所需软件包的步骤:

直接去源头,这里提供了一个google-api-python-client的链接,但如果您需要其他语言,则应该不会有太大区别。

https://github.com/google/google-api-python-client

在页面左上角附近点击绿色的“Clone or Download”按钮并将其保存为zip文件。将zip文件移动到您的项目文件夹中,并在那里解压缩。然后将该文件夹中所有文件都剪切回到您的项目文件夹的根目录中。

是的,这确实会使您的工作空间混乱,但很多编译器都有隐藏文件的方法。

完成此操作后,标准程序应该就可以正常运行了。

from googleapiclient import discovery

工作得很好。

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接