Python 这个错误是什么意思?为什么会发生?

Python 这个错误是什么意思?为什么会发生?,python,Python,在此代码中: import requests, pprint, re, gspread, time from oauth2client.service_account import ServiceAccountCredentials from datetime import datetime import oauth2client, httplib2 from oauth2client.file import Storage def temperature(): scope = [

在此代码中:

import requests, pprint, re, gspread, time
from oauth2client.service_account import ServiceAccountCredentials
from datetime import datetime
import oauth2client, httplib2
from oauth2client.file import Storage



def temperature():
    scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
    storage = oauth2client.file.Storage('Singapore-Weather-84def2be176a.json')
    credentials = storage.get()
    http = httplib2.Http()
    http = credentials.authorize(http)
    credentials.refresh(http)
    gc = gspread.authorize(credentials)

    wks = gc.open('Singapore Weather').sheet1
    r = requests.get('https://api.darksky.net/forecast/b02b5107a2c9c27deaa3bc1876bcee81/1.312914,%20103.780257')
    json_object = r.json()


    regexCurrentTemp = re.compile(r'"temperature":(\d\d.\d\d)')
    moTemp = regexCurrentTemp.search(str(json_object))
    temperature = moTemp.group(1)

    regexApparentTemp = re.compile(r'"apparentTemperature":(\d\d.\d\d)')
    moApparent = regexApparentTemp.search(str(json_object))
    apparent = moApparent.group(1)

    current = json_object['currently']
    cloud = current['cloudCover']
    cloud *= 100

    timenow = datetime.now()
    wks.append_row([str(timenow), temperature, apparent, cloud])

while True:
    temperature()
    time.sleep(3597)
我得到了一个与其中一个模块相关的错误代码,我不知道这是什么意思。错误是:

Traceback (most recent call last):
  File "/Users/rosen59250/PycharmProjects/MorningWeather/main.py", line 39, in <module>
    temperature()
  File "/Users/rosen59250/PycharmProjects/MorningWeather/main.py", line 12, in temperature
    credentials = storage.get()
  File "/Users/rosen59250/EvenorOdd/lib/python3.7/site-packages/oauth2client/client.py", line 407, in get
    return self.locked_get()
  File "/Users/rosen59250/EvenorOdd/lib/python3.7/site-packages/oauth2client/file.py", line 54, in locked_get
    credentials = client.Credentials.new_from_json(content)
  File "/Users/rosen59250/EvenorOdd/lib/python3.7/site-packages/oauth2client/client.py", line 302, in new_from_json
    module_name = data['_module']
KeyError: '_module'
回溯(最近一次呼叫最后一次):
文件“/Users/rosen59250/PycharmProjects/MorningWeather/main.py”,第39行,在
温度()
文件“/Users/rosen59250/PycharmProjects/MorningWeather/main.py”,第12行,温度
凭据=存储。获取()
get中第407行的文件“/Users/rosen59250/EvenorOdd/lib/python3.7/site packages/oauth2client/client.py”
返回self.locked_get()
文件“/Users/rosen59250/EvenorOdd/lib/python3.7/site packages/oauth2client/File.py”,第54行,在locked_get中
credentials=client.credentials.new_from_json(content)
文件“/Users/rosen59250/EvenorOdd/lib/python3.7/site-packages/oauth2client/client.py”,第302行,以新的格式,来自json
模块名称=数据[“模块”]
KeyError:“\u模块”
为什么会出现这种错误代码?有没有办法解决这个问题,或者这是模块中的一个错误


如果我能修复它,我怎么能?

您的数据目录中没有“\u模块”密钥。使用json身份验证对我有效:

pass_url='/my/json/pass.json'
范围=['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds=ServiceAccountCredentials.from_json_keyfile_name(传递url,范围)
client=gspread.authorize(creds)
然后,客户端可以打开工作表、追加行等。
希望这对您有所帮助,因为您没有使用
oauth2client
所期望的json格式,所以出现此错误。来自json的新代码说明:

class方法new_from_json(json_data)[source]实用类方法 从JSON实例化凭证子类

希望JSON字符串是由to_JSON()生成的。

参数:json_data–字符串或字节,json from to_json()

返回:已创建的凭据子类的实例 使用to_json()序列化

这里的关键是,它希望您给它的json对象是它作为类的序列化实例生成的对象。您不能只给它任何arrbitrary json对象,然后期望它知道该做什么

当您从modules
到_JSON
方法生成JSON序列化凭证对象时,它将设置
_module
_class
数据


#我们稍后将需要附加信息来重建此实例。
要序列化[''类']=当前类型。\uu\u名称__
要序列化[''模块']=当前类型。\模块__
这一点很重要的原因是,当您稍后尝试执行
new\u from\u json
时,它将执行这部分代码


#从_json()中查找并调用正确的classmethod进行还原
#物体。
模块名称=数据[“模块”]
在您的情况下,这会失败,因为您使用的json不是模块生成的json凭证对象。这一点很重要的原因是,在代码的后面,它需要知道要返回给您的服务帐户对象

def from_json(cls,json_数据):
#TODO(第388期):消除循环性,这是
#此非顶级导入。
从oauth2client导入服务\u帐户
data=json.load(_helpers._from_bytes(json_数据))
#我们处理service_account.ServiceAccountCredentials,因为它是
#Google凭证的可能返回类型。get_application_default()
如果(数据[''u模块]]='oauth2client.service\u帐户'
数据[“U类”]=“ServiceAccountCredentials”):
返回服务\u帐户。服务帐户凭据。来自\u json(数据)
elif(数据['''u模块']='oauth2client.service\u account'和
数据[''u class']=''u JWTAccessCredentials'):
返回服务\u帐户。\u JWTAccessCredentials.from\u json(数据)

长话短说,你不能给它任何旧的json并期望它工作。你需要首先在类中创建你的凭证对象,然后调用它的to_json方法,然后序列化该对象,以便以后能够使用它从存储中加载凭证

不是这样。客户端是模块的一部分,而不是字典。您可以尝试在Client.py的第302行之前插入一个
打印(数据)
,以查看字典的内容。虽然jufx的回答没有太大帮助,但他可能对丢失的钥匙是正确的…;)我非常确定client.py只是oauth2client的一部分。它可能是oauth2client.file。我认为这是因为代码没有调用文件,我100%肯定你是对的,我没有要求任何其他东西。但是,您仍然需要跟踪错误,对吗?因此,要么(i)自己编写所有内容,要么(ii)使用另一个包/导入,或者(iii)尝试修复错误。-明智地选择。敲门敲门谁在那儿打印(数据)不起任何作用。我不知道该怎么做。我运行了client.py,它什么也没做。我运行main.py(我的脚本名),它什么也没做。如果我使用google提供给我的json,并通过json命令将其输入,这会起作用吗?您需要创建一个oauth2client连接,为其提供任何身份验证/密钥/登录详细信息,一旦您有了一个有效的oauth2client连接,您就可以在该实例上调用该
到_json
,它会将您的数据序列化到一个json文件中,您以后可以使用该文件来加载连接,而无需手动提供所有信息,但需要注意的是,如果这是新代码,您构建的oauth2client是无效的不推荐使用,github页面建议使用其他libaray,真的吗?这很烦人,因为我不知道现在该怎么办。从github页面的oauth2client
oauth2client现在已经被弃用了。不再向库中添加更多功能,核心团队拒绝支持。我们建议您使用google auth和oauthlib