Come posso ottenere subprocess.check_call per darmi l'output binario non elaborato di un comando, sembra che lo stia codificando in modo errato da qualche parte.Python non ottiene raw binary dal sottoprocesso.check_call
Dettagli:
mi hanno un comando che restituisce testo come questo:
some output text “quote” ...
(quelle citazioni sono e2809d unicode)
Ecco come sto chiamando il comando:
f_output = SpooledTemporaryFile()
subprocess.check_call(cmd, shell=True, stdout=f_output)
f_output.seek(0)
output = f_output.read()
Il problema è che ottengo questo:
>>> repr(output)
some output text ?quote? ...
>>> type(output)
<str>
(E se chiamo 'ord' il '?' Ottengo 63.) Sono su Python 2.7 su Linux.
Nota: l'esecuzione dello stesso codice su OSX funziona correttamente con me. Il problema è quando lo eseguo su un server Linux.
E 'possibile che il programma chiamato modifichi l'uscita in base a quale stdout è. Che ne dici di aprire un file regolare e vedere quali byte sono effettivamente scritti. BTW, 'SpooledTemporaryFile' è sopra uccisione. La parte "spool" funziona solo per cose scritte da python. Quando hai ottenuto il descrittore del file lo ha cambiato in un normale file temporaneo. Il buffer StringIO extra non è stato utilizzato. – tdelaney
Ho scritto un rapido programma python che sputa la stringa utf-8 e il tuo programma ha funzionato per me. – tdelaney
Provare a eseguire il comando in una shell e reindirizzare a un file. Se hai 'vim' installato dovresti anche avere' xxd', che può visualizzare un dump esadecimale di file. Nel testo di esempio, l'output di utf-8 dovrebbe essere simile a: '' '0000000: 736f 6d65 206f 7574 7075 7420 7465 7874 parte del testo di output 0000010: 20e2 809c 7175 6f74 65e2 809d 202e 2e2e ... preventivo ... .. .''' La virgoletta di sinistra è 'e2 80 9c' e la citazione di destra è' e2 80 9d' –