Пример кода для Python 2. Я могу воспроизвести эту ошибку с Python 3. Для справки, полный возврат:
Traceback (most recent call last):
File "example.py", line 85, in <module>
doHeading('First heading', h1)
File "example.py", line 76, in doHeading
bn=sha1(text+sty.name).hexdigest()
TypeError: Unicode-objects must be encoded before hashing
Причина в том, что метод sha1()
ожидает байты, а не строку. Python 2 менее строг с обработкой строк, поэтому он не дает исключения.
Таким образом, у вас есть два варианта: либо использовать Python 2 (что не рекомендуется для нового кода), либо вы можете обновить код для работы с Python 3. Я мог бы получить этот конкретный пример, работающий с двумя незначительными изменениями:
В строке 76 заменить
bn=sha1(text+sty.name).hexdigest()
от
bn=sha1((text+sty.name).encode('ascii')).hexdigest()
В строке 11 используется apply()
, что устарело с Python 2.3. Для обновления замените
apply(BaseDocTemplate.__init__, (self, filename), kw)
от
BaseDocTemplate.__init__(*(self, filename), **kw)
Обратите внимание, что пример с этими модификациями прекрасно работает в Python 2 и 3 (протестирован с 2.7 и 3.6).