gmail API:TypeError:序列项0:预期的str实例,找到的字节

时间:2016-04-02 20:59:16

标签: python-3.x gmail-api

我尝试使用GMail API下载一条消息。以下是我的追溯: pdiracdelta @ pdiracdelta-Laptop:〜/ GMail元数据$ ./main.py

credentials = get_credentials()
print(credentials)
print(str(credentials.invalid))
http = credentials.authorize(httplib2.Http())
service = discovery.build('gmail', 'v1', http=http)

以下是一段代码,它在Traceback之前生成凭证对象和布尔打印。它确认凭证对象有效,并按照Google

的建议使用
service = discovery.build('gmail', 'v1', http=http)

这里出了什么问题?在我看来,我没有错,因为问题可以追溯到select s.studentId, r.resultID as ThisResultID, r.*, arv.*, u.fullname as TeacherName from (Results R left join AssessmentResultValues arv on r.resultID = arv.resultID) left join users u on u.userID = R.userID left join students as s on s.studentId = R.studentId where arv.resulttypeID = 32 and assessmentID = 181 and yearID = 21 and Month = 0 and Term = 0 and Week = 0 and Semester = 1 and s.studentClassId = 3 order by dateentered ,它只使用有效信息(暗示堆栈中进一步使用的一个包无法处理这些有效信息)。这是一个错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

更新:似乎use Respect\Validation\Validator as v; $number = 123; v::numeric()->validate($number); // true 函数现已修补。更新你的python版本应该解决问题(我现在使用的是3.6.7)。

在Padraic Cunningham的帮助下解决,他将问题确定为编码问题。我通过将_normalize_headers应用于.decode('utf-8')键并且值(header是dict)来解决了这个问题,如果它们是字节类型的对象(显然是UTF-8编码的)并转换它们到python3字符串。这可能是由于谷歌API中混合了一些python2 / 3。

此修复程序还包括将所有代码从Google API示例更改为python3代码(例如异常处理),但最重要的是,我的解决方法是在第193-194行编辑headers,将/usr/lib/python3/dist-packages/httplib2/__init__.py函数重新定义为:

_normalize_headers(headers)

警告:此解决方法显然非常脏,因为它涉及编辑def _normalize_headers(headers): for key in headers: # if not encoded as a string, it is ASSUMED to be encoded as UTF-8, as it used to be in python2. if not isinstance(key, str): newkey = key.decode('utf-8') headers[newkey] = headers[key] del headers[key] key = newkey if not isinstance(headers[key], str): headers[key] = headers[key].decode('utf-8') return dict([ (key.lower(), NORMALIZE_SPACE.sub(value, ' ').strip()) for (key, value) in headers.items()]) 包中的文件。如果有人找到了更好的解决方案,请在此处发布。