Pythonpfeife cp1252 String von PowerShell zu einem Python (2.7) Skript

Nach ein paar Tagen der Wohnung über Stackoverflow und Python 2.7 doc, bin ich zu diesem Schluss gekommen.

Grundsätzlich laufe ich ein Python-Skript auf einem Windows-Server, der als Eingabe einen Block von Text haben muss. Dieser Textblock (leider) muss von einer Pipe übergeben werden. Etwas wie:

PS > [something_that_outputs_text] | python .\my_script.py

Also das Problem ist:

Der Server nutzt cp1252 Kodierung und ich kann es wirklich nicht ändern wegen administrativen Vorschriften und was nicht. Und wenn ich den Text zu meinem Python-Skript pfeife, wenn ich es lese, kommt es schon mit ? Wohingegen Zeichen wie \xe1 sein sollten.

Was ich bisher gemacht habe:

Getestet mit UTF-8. Yep, chcp 65001 und $OutputEncoding = [Console]::OutputEncoding "löst es", wie in python bekommt den Text perfekt und dann kann ich es auf Unicode etc. decodieren. Aber anscheinend lassen sie mich nicht auf dem Server / trauriges Gesicht.

Ein kleines Skript zu testen, was zur Hölle geschieht:

 import codecs import sys def main(argv=None): if argv is None: argv = sys.argv if len(argv)>1: for arg in argv[1:]: print arg.decode('cp1252') sys.stdin = codecs.getreader('cp1252')(sys.stdin) text = sys.stdin.read().strip() print text return 0 if __name__=="__main__": sys.exit(main()) 

Versuchte es mit den codecs wickeln und ohne es.

Meine Eingabe & Ausgabe:

 PS > echo "Blá" | python .\testinput.py blé blé Bl? 

-> Also gibt es kein Problem mit dem Argument (Blé), aber der Piped Text (Blá) ist nicht gut 🙁

Ich habe sogar den Textstring in Hex umgewandelt und ja, es wird mit 3f (AKA mr ? ) Überschwemmt, also ist es kein Problem mit dem print .

[Auch: es ist meine erste Frage hier … fühlen Sie sich frei zu fragen, mehr Infos über was ich tat]

BEARBEITEN

Ich weiß nicht, ob dies relevant ist oder nicht, aber wenn ich sys.stdin.encoding es gibt None

Update: Also … ich habe keine Probleme mit cmd. Checked sys.stdin.encoding beim Ausführen des Programms auf cmd und alles ging gut. Ich denke, mein Kopf explodierte nur.

One Solution collect form web for “Pythonpfeife cp1252 String von PowerShell zu einem Python (2.7) Skript”

Wie wäre es mit dem Speichern der Daten in eine Datei und Piping es zu Python auf einer CMD-Sitzung? Rufen Sie Powershell und Python auf CMD auf. Wie so,

 c:\>powershell -command "c:\genrateDataForPython.ps1 -output c:\data.txt" c:\>type c:\data.txt | python .\myscript.py 

Bearbeiten

Eine weitere Idee: Konvertieren Sie die Daten in das Base64-Format in Powershell und decodieren Sie es in Python. Base64 ist einfach in Powershell, denke ich in Python ist es auch nicht schwer . Wie so,

 # Convert some accent chars to base64 $s = [Text.Encoding]::UTF8.GetBytes("éêèë") [System.Convert]::ToBase64String($s) # Output: w6nDqsOow6s= # Decode: $d = [System.Convert]::FromBase64String("w6nDqsOow6s=") [Text.Encoding]::UTF8.GetString($d) # Output éêèë 
Python ist die beste Programmiersprache der Welt.