Вы можете использовать Подушка :
from PIL import Image
filename = r'logo.png'
img = Image.open(filename)
img.save('logo.ico')
При желании вы можете указать нужные размеры значков:
icon_sizes = [(16,16), (32, 32), (48, 48), (64,64)]
img.save('logo.ico', sizes=icon_sizes)
Документы Pillow говорят, что по умолчанию будут генерироваться размеры
[(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (255, 255)]
и любой размер больше исходного или 255 будет игнорироваться.
Да, он находится в разделе Только для чтения документации, но в некоторой степени работает.