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