¿Por qué Python no reconoce mi archivo fuente codificado en utf-8?

Aquí hay un pequeño tmp.py con un carácter no ASCII:

if __name__ == "__main__": s = 'ß' print(s) 

Al ejecutarlo me sale el siguiente error:

 Traceback (most recent call last): File ".\tmp.py", line 3, in  print(s) File "C:\Python32\lib\encodings\cp866.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError: 'charmap' codec can't encode character '\xdf' in position 0: character maps to  

La documentación de Python dice :

De forma predeterminada, los archivos de origen de Python se tratan como codificados en UTF-8 …

Mi forma de verificar la encoding es usar Firefox (tal vez alguien sugiera algo más obvio). Abro tmp.py en Firefox y si selecciono Ver-> Codificación de caracteres-> Unicode (UTF-8) se ve bien, esa es la forma en que se ve arriba en esta pregunta (con el símbolo ß).

Si pongo:

 # -*- encoding: utf-8 -*- 

como la primera cadena en tmp.py no cambia nada, el error persiste.

¿Podría alguien ayudarme a averiguar qué estoy haciendo mal?

La encoding que usa tu terminal no admite ese carácter:

 >>> '\xdf'.encode('cp866') Traceback (most recent call last): File "", line 1, in  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/encodings/cp866.py", line 12, in encode return codecs.charmap_encode(input,errors,encoding_map) UnicodeEncodeError: 'charmap' codec can't encode character '\xdf' in position 0: character maps to  

Python lo está manejando muy bien, es su encoding de salida la que no puede manejarlo.

Puedes intentar usar chcp 65001 en la consola de Windows para cambiar tu página de códigos; chcp es un comando de la línea de comandos de Windows para cambiar las páginas de códigos.

El mío, en OS X (usando UTF-8) puede manejarlo bien:

 >>> print('\xdf') ß