Closed LukeSavefrogs closed 1 year ago
Piccola nota per chiarire un punto non chiaro all'inizio:
Non viene stampata l'exception UnicodeEncodeError
perchè nei test stdout
e stderr
vengono catturati separatamente:
Entrambe le soluzioni funzionavano.
Tuttavia per comodità al momento preferisco impostare il flag -X utf8
all'interprete python
in modo da ignorare i default di piattaforma.
Ho scartato il metodo che utilizzava io.TextIOWrapper
in quanto andava utilizzato prima di qualsiasi altro utilizzo di sys.stdout
o sys.stdin
, altrimenti avrebbe potuto non funzionare per gli oggetti che utilizzano il "vecchio" stdout
.
Il problema può essere risolto in 2 step:
--python-option X utf8
al comando di build dell'eseguibilesubprocess.run(..., encoding="utf8")
(notare come venga specificato esplicitamente il tipo di encoding
da utilizzare) ogni volta che nei test va lanciato l'eseguibile.Il comando con cui viene attualmente "compilato" l'eseguibile:
Problema
Durante i test automatici (
python -m unittest discover --catch
) il testtests.test_bundle.test_error_file_not_found
fallisce sempre in maniera silenziosa, in quanto non viene mai stampatoThe following required files were not found
.Questo testo viene da un'eccezione rilasciata dalla funzione
require_files
:https://github.com/LukeSavefrogs/danea-easyfatt/blob/8d8c0630153a276dd7195ff42cf98ff5f5c1b147/src/veryeasyfatt/app/main.py#L50-L52
Aggiungendo poco prima della
Exception
unaprint
con la stessa stringa otteniamo l'errore di seguito:Sembra quindi che il carattere
→
crei problemi durante i test automatici (con o senza il flag--disable-rich-logging
).Analisi
Prendendo spunto da questa risposta su SO, ho controllato il tipo di encoding di default utilizzato:
Questi sono i risultati del test:
L'esecuzione diretta (nel venv) funziona come dovrebbe
Anche eseguendo il file
.exe
tutto funziona:Lanciando l'eseguibile tramite
subprocess
invece, i caratteri non vengono interpretati correttamente:Sembra che quindi la differenza stia nel
sys.stdout.encoding
, che nel caso di una console NON interattiva (sys.stdout.isatty()
infatti restituisceFalse
) assume un default platform-specific (come visto nell'issue #107 il character encoding per Windows storicamente ècp1252
, cioè Windows-1252).Soluzioni
io.TextIOWrapper
Il seguente è più un workaround che una soluzione vera e propria:
Il risultato è questo:
Forzatura
PYTHONUTF8
durante buildE' possibile specificare il valore della variabile
PYTHONUTF8
direttamente in fase di build dell'eseguibile.L'equivalente CLI di quanto mostrato nell'esempio è
--python-option PYTHON_OPTION
.Tuttavia facendo ciò il risultato è il seguente: