Jak mogę uzyskać subprocess.check_call, aby podać surowe wyjście binarne polecenia, wydaje się, że gdzieś jest ono niepoprawnie zakodowane.Python nie pobiera surowego binarnego z subprocess.check_call
Szczegóły:
Mam polecenie, która zwraca tekst tak:
some output text “quote” ...
(cytaty te są unicode e2809d)
Oto jak dzwonię polecenie:
f_output = SpooledTemporaryFile()
subprocess.check_call(cmd, shell=True, stdout=f_output)
f_output.seek(0)
output = f_output.read()
Problem jest następujący:
>>> repr(output)
some output text ?quote? ...
>>> type(output)
<str>
(A jeśli wezwać "ord", "?" Otrzymuję 63.) Jestem na Pythonie 2.7 na Linux.
Uwaga: Uruchomienie tego samego kodu na OSX działa poprawnie dla mnie. Problem pojawia się, gdy uruchomię go na serwerze Linux.
Możliwe, że wywoływany program dostosowuje swój sygnał wyjściowy w zależności od tego, co jest standardowe. Co powiesz na otwarcie zwykłego pliku i sprawdzenie, które bajty są faktycznie zapisane. BTW, 'SpooledTemporaryFile' jest po zabiciu. Część "buforowana" działa tylko dla rzeczy napisanych z Pythona. Po otrzymaniu deskryptora pliku zmieniono go na zwykły plik tymczasowy. Dodatkowy bufor StringIO nie był używany. – tdelaney
Napisałem szybki program Pythona, który wypluwa ciąg znaków utf-8 i Twój program pracował dla mnie. – tdelaney
Spróbuj uruchomić polecenie w powłoce i przekieruj do pliku. Jeśli masz zainstalowany 'vim', powinieneś także mieć' xxd', który może wyświetlać zrzut pliku hex. W twoim przykładowym tekście, wyjście utf-8 powinno wyglądać tak: '' '0000000: 736f 6d65 206f 7574 7075 7420 7465 7874 część tekstu wyjściowego 0000010: 20e2 809c 7175 6f74 65e2 809d 202e 2e2e ... cytat ... .. '' 'Lewy cytat to' e2 80 9c' a prawy cytat to 'e2 80 9d' –