GSpread导入错误:找不到名为oauth2client.service_account的模块。

12

好的,我正在学习“成为技术营销人员”课程,并尝试学习如何使用GSpread管理Google电子表格。我已经按照http://gspread.readthedocs.io/en/latest/oauth2.html上的文档进行了操作。我按照上面第二个URL中的步骤运行了一个包含以下代码的文档:

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds']

credentials = ServiceAccountCredentials.from_json_keyfile_name('DFS Google Sheets Data Imports-7205de852ff7.json', scope)

gc = gspread.authorize(credentials)

wks = gc.open("Authority Scraper").sheet1
wks.update_cell(1,2,"Hello World!")

因此我在终端中得到以下错误:from oauth2client.service_account import ServiceAccountCredentials ImportError: No module named oauth2client.service_account

终端错误输出

请有人帮帮我。其他“没有名为oath2client.service_account的模块”的答案对我没有用。谢谢!


1
看起来你的解释器找不到oauth2client模块。你使用的是哪个操作系统/Python版本?pip install --upgrade oauth2client是否没有出现错误? - Jacques Gaudin
1
我在想这个是否相关:https://github.com/burnash/gspread/issues/357。我认为`SignedJwtAssertionCredentials`已经被弃用了,在`oauth2client`中,`gspread`也转移到了`ServiceAccountCredentials`。正如建议的那样,您的`oauth2client`版本和其支持的登录机制可能不匹配,因此请更新到最新版本以使用`ServiceAccountCredentials`或者使用旧方法`SignedJwtAssertionCredentials`与您现有的版本。 - roganjosh
实际上,这引起了很多混淆。在“gspread”标签中,您之前的问题与此直接相关,因此查看此问题的观众可能还对由此更改引起的错误的另一种表现感兴趣。我的github链接中也有一个错别字。它是:https://github.com/burnash/gspread/issues/357 - roganjosh
@JacquesGaudin 是的,由于某种原因,它一直不让我升级或安装它,我刚意识到当我运行 pip list 时 oauth2client 不在其中,当我尝试升级或安装它时,我会得到这个 [错误] (http://imgur.com/vkPAHva)。 - Ryan Bonhardt
1
从这个讨论(https://github.com/pypa/pip/issues/3165)中,您可以执行“pip install --ignore-installed six”。 - Jacques Gaudin
显示剩余2条评论
4个回答

18

以下命令对我有用 - sudo pip install --upgrade oauth2client

从oauth2client库的github仓库获取了此命令。


3
根据这个讨论

这是因为 OS X El Capitan 已经预装了六个1.4.1版本,当它试图卸载它时,由于系统完整性保护不允许即使是管理员修改这些目录,所以无法执行。

在回答中提到的几种解决方法中,可能值得尝试 pip install --ignore-installed six 来避免尝试卸载系统的 six 包。

1
你可以通过检查你的库中是否有多个文件夹来解决错误。
C:\Python27\Lib\site-packages\oauth2client
C:\Program Files (x86)\Google\Google_Appengine\lib\google-api-python-client\oauth2client

您只需要删除其中一个文件夹或更改编译器中的库路径。

这是我在该主题上制作的视频链接:

如何修复:“Python中没有名为service_account的模块”


1

我也遇到了这个问题,最终发现是路径问题。尽管我知道这有点牵强附会(因为每个人的开发环境都不同),但我在这里写下这个解决方案,以帮助其他人。

简而言之,确保没有任何东西干扰了你的$PYTHONPATH

请记住,当您在Python中进行“import”时,Python会检查sys.path中的软件包。该列表具有优先顺序(即如果在列表中较早的路径中找到软件包,则将使用该软件包)。

在我的情况下,看起来我的$PYTHONPATH已经在一段时间前进行了一些appengine操作时被修改了。结果,当Python尝试执行from oauth2client.service_account时,它会获取appengine中的oauth2client而不是我期望它获取的oauth2client(这是由于$PYTHONPATH已被修改的结果)。

您可以通过在导入调用之前打印sys.path来验证是否也发生了这种情况:

import sys
print sys.path
from oauth2client.service_account import ServiceAccountCredentials

在我的情况下,我可以清晰地看到一堆占主导地位的appengine路径。这促使我检查了我的~/.bash_profile文件,在那里我发现了这行代码:
export PYTHONPATH=$PYTHONPATH::$LOCAL_APPENGINE_HOME/lib/:$LOCAL_APPENGINE_HOME/lib/yaml/:$LOCAL_APPENGINE_HOME:$LOCAL_APPENGINE_HOME/lib/webapp2-2.5.2/`

将其注释掉后,启动新的 shell,一切都正常工作。


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