2015-12-08 5 views
8

So habe ich ein Raspberry Pi mit Debian und der WebIOPi system. Der Daemon läuft gut, wenn ich ihn mit einem standardmäßigen '$ sudo /etc/init.d/webiopi start'-Befehl starte, aber der automatische Start funktioniert nicht' $ sudo update-rc.d webiopi defaults '.Python-Codierung Probleme beim Start-Skript in Raspberry Pi debian

Das Protokoll schlägt vor, es ist ein Codierungsproblem in Python, meine Vermutung Python verwendet ASCII, aber die Skriptdatei verwendet UTF8.

Warum funktioniert es normal, aber nicht in Autostart und was ist ein guter Weg, um das zu beheben?

+1

umfassen Was die genaue Fehlermeldung ist ? – flo

+0

@flo Leider habe ich keinen konstanten Zugriff auf den Pi, aber es war entlang dieser Linie '' ASCII'-Codec kann nicht das Zeichen **** in Position codieren **: Ordnungszahl nicht im Bereich (128) ' –

Antwort

2

Um das Protokoll und Ihren Verdacht zu bestätigen, ist dies ein Codierungsproblem (Bytes vs String am wahrscheinlichsten). Selbst wenn Sie die Kodierung Ihrer Datei mit # -*- coding: utf-8 -*- auf UTF-8 setzen, können Sie immer noch Probleme mit Text haben, der von einem Formular in ein anderes geändert wurde.

Zeichenfolgen sind nicht wirklich Zeichenfolgen, sondern Darstellungen von Bytes in einer bestimmten Reihenfolge. UTF-8 ermöglicht die Codierung von viel mehr Zeichen, als ASCII verarbeiten kann. Wenn Sie also versuchen, ein in einer UTF-8-codierten Zeichenfolge vorhandenes Zeichen in eine ASCII-codierte Zeichenfolge zu konvertieren, erhalten Sie eine Fehlermeldung, da keine solche Codierung vorhanden ist .

Ich kann keine viel bessere Antwort ohne weitere Informationen, wie Code und/oder Datenquelle geben.

https://docs.python.org/2/howto/unicode.html#the-unicode-type Lesen lernen wir durch das folgende Beispiel studiert (e):

>>> unicode('abcdef') 
u'abcdef' 
>>> s = unicode('abcdef') 
>>> type(s) 
<type 'unicode'> 
>>> unicode('abcdef' + chr(255))  
Traceback (most recent call last): 
... 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 6: 
ordinal not in range(128) 

Die Dokumentation erwähnt auch, dass Sie diese Ausnahmen entweder zu ersetzen oder zu ignorieren, sie zu handhaben können wählen, etwa so:

>>> unicode('\x80abc', errors='strict')  
Traceback (most recent call last): 
    ... 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: 
ordinal not in range(128) 
>>> unicode('\x80abc', errors='replace') 
u'\ufffdabc' 
>>> unicode('\x80abc', errors='ignore') 
u'abc' 

HINWEIS 1: In Python 3 haben sich die Dinge geändert. für das Schreiben von Code, die mit Python 3 kompatibel ist, empfehle ich folgende lesen:

https://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

ANMERKUNG 2: Es ist auch erwähnenswert, dass, wenn Ihre Codierung Problem auftritt beim Versuch, die Zeichenfolge auf dem angezeigt werden Konsole dann, Python hat einen -u Schalter, der in bestimmten Situationen verwendet werden kann, wie wenn Sie eine Binärdatei über ein CGI-Skript bedienen, das die Pufferung von Strings ausschalten wird, aber das öffnet eine andere Dose Würmer. Aber nichtsdestoweniger, dieses Verhalten nachahmen, ohne -u Aufruf:

>>> print 'test' 
'test' 
>>> import os 
>>> import sys 
>>> sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) 
>>> print 'test' 
test 
0

Dies ist wirklich auf dem Programm abhängt.

Wenn jedoch ein Unterschied zwischen manuellem Starten und Starten des Systems besteht, sollte der Hauptunterschied in Umgebungsvariablen liegen. Dies ist typisch für z.B. inittab.

zwei Möglichkeiten - entweder Ihre locale nicht eingerichtet ist, oder ein Skript endet mit verschiedener Version von Python.

Für die frühere, in Betracht ziehen LANG (präzise) oder bei Bedarf LC_ALL (ein Hammer) zu diesem Skript oder globalen Umgebung für alle Startaufgaben.

Sie können manuell versuchen, diese beiden Anrufungen Vergleich:

sudo LC_ALL=en_US.UTF-8 /etc/init.d/webiopi start 

gegen

sudo LC_ALL=C /etc/init.d/webiopi start 

Für letztere versuchen PATH auf sich ändernde nur einige /bin:/usr/bin:/usr/local/bin