Ich dachte, ich würde doch Python starten
print("Hello world")
Ja, gut.
Druck ("Japanisch")
Traceback (most recent call last):
File "/tmp/a.py", line 1, in <module>
print("\u65e5\u672c\u8a9e");
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
:cry: :-1:
Nach vielen Recherchen stellte ich fest, dass ich zwischen Unicode und Byte konvertieren musste.
print ("Japanisch" .encode ("utf-8"))
b'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
Nein, das ist nicht der Fall.
setenv LANG ja_JP.UTF-8
japanisch
Nun, es hat funktioniert. Aber es gibt noch mehr Probleme!
Wenn Sie cron starten, ist der übergeordnete Prozess cron, daher erbt er natürlich die cron-Umgebung. Das ist die Geschichte, welche Art von Gebietsschema für das gesamte System festgelegt ist. Da jedoch die Richtlinie des gesamten Systems mit dem Basis-C vereinheitlicht ist (wenn ls oder date auf das japanische Gebietsschema-Format eingestellt sind, funktionieren verschiedene Dinge nicht), ist die Cron-Umgebung natürlich LANG = C. Es kann nicht geändert werden.
Um das Skript zu starten, schreiben Sie in die erste Zeile "#! / Usr / local / bin / python3". Es gibt viele Möglichkeiten, dies zu nennen, aber es scheint Shebang zu sein. Also, was dies genannt wird, kann Shebang nicht zweimal verwenden. Mit anderen Worten, wenn "#! / Usr / local / bin / foo", sollte die erste Zeile von / usr / local / bin / foo nicht "#! / Usr / local / bin / bar" sein. .. Das wusste ich nicht. Möglicherweise rufen Sie eine exec () - Reihe von Funktionen in einem Systemaufruf auf.
Die Idee, / usr / local / bin / python3 in ein Shell-Skript umzuwandeln, war frustriert, sodass ich keine andere Wahl hatte, als es in C zu schreiben.
python3.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv){
putenv("LANG=ja_JP.UTF-8");
argv[0] = "/usr/local/bin/python3.5";
argv[argc] = NULL;
execv("/usr/local/bin/python3.5",argv);
}
Jetzt funktioniert es nur noch mit dem ersten print (" Japanese "). (Ich brauche keine Kodierung mehr)
python3 ist keine symbolische Verbindung mehr, sondern eine gewaltsame Gegenmaßnahme. Bitte haben Sie etwas Geduld.
Irgendwie gelöst. Die Straße nach Pythonista ist steil
Recommended Posts