ubuntuusers.de

Python Script

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Lae6ge6k

Anmeldungsdatum:
19. Februar 2013

Beiträge: 566

Hallo. Installiert habe ich Ubuntu 12.04.3(64BIT) und Python

1
2
internet@andy-desktop:~$ python -V
Python 2.7.3

Ich habe mir gerade ein einfaches Python-Script gebaut. Aber es will nicht funktionieren.

1
2
3
4
5
6
#!/usr/bin/env python
# Mein Hallo-Welt-Programm fuer Python 2
print 'Hallo Welt!-Dies ist Python 2'
#!/usr/bin/env python3
# Mein Hallo-Welt-Programm fuer Python 3
print('Hallo Welt hier grüsst python3')

Im Terminal bekomme ich folgenden output >>>

internet@andy-desktop:~$ '/home/internet/Arbeitsfläche/Python1.test.py' 
  File "/home/internet/Arbeitsfläche/Python1.test.py", line 6
SyntaxError: Non-ASCII character '\xc3' in file /home/internet/Arbeitsfläche/Python1.test.py on line 6, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Die folgende Internetseite hat ich ganz kurz besucht. http://www.python.org/peps/pep-0263.html

Aber die ist English, und English verstehe ich nicht.

Wer könnte mir bei der Code Analyse helfen?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17618

Wohnort: Berlin

Mit

1
print('Hallo Welt hier gruesst python3')

klappt es?

Lae6ge6k

(Themenstarter)

Anmeldungsdatum:
19. Februar 2013

Beiträge: 566

Leider nein.

1
2
3
internet@andy-desktop:~$ '/home/internet/Arbeitsfläche/Python3.test.py' 
/home/internet/Arbeitsfläche/Python3.test.py: Zeile 1: Syntaxfehler beim unerwarteten Wort `'Hallo Welt hier gruesst python3''
/home/internet/Arbeitsfläche/Python3.test.py: Zeile 1: `print('Hallo Welt hier gruesst python3')'

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Du hast da einmal ein Python2 und einmal ein Python3 Script. Entscheide dich doch erstmal für eins von den beiden. Beides zusammen in einer Datei ist komisch.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Encoding von Strings ist in Python etwas, das man verstehen muss (sie das in der Fehlermeldung erwähnte Dokument: http://www.python.org/dev/peps/pep-0263/ ) - so sollte es klappen - bei Python2 ist die Herausforderung einen richtig encodierten String in der Shell ausgeben zu lassen - das klappt automatisch, wenn man das Encoding der Datei richtig deklariert und dort einen unicode-String angibt:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
print u'Die Welt grüßt python2'

#!/usr/bin/env python3
print('Die Welt grüßt python3')

Lae6ge6k

(Themenstarter)

Anmeldungsdatum:
19. Februar 2013

Beiträge: 566

Klappt auch nicht.

1
2
3
4
5
6
#!/usr/bin/python2
# -*- encoding: utf-8 -*-
print u'Die Welt grüßt python2'

#!/usr/bin/python3
print('Die Welt grüßt python3'
1
2
3
4
5
internet@andy-desktop:~$ '/home/internet/Arbeitsfläche/Python4.test.py' 
  File "/home/internet/Arbeitsfläche/Python4.test.py", line 7
    
                                    ^
SyntaxError: invalid syntax

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Wenn du die schließen Klammer weglässt hast du einfach nur Syntax-Fehler generiert...

Lae6ge6k

(Themenstarter)

Anmeldungsdatum:
19. Februar 2013

Beiträge: 566

Oh Entschuldigung, Da hab ich doch eine Klammer Übersehen. Das habe ich nocheinmal richtig gemacht. Als ouput habe ich dann>>>

1
2
3
4
5
6
#!/usr/bin/python2
# -*- encoding: utf-8 -*-
print u'Die Welt grüßt python2'

#!/usr/bin/python3
print('Die Welt grüßt python3')
1
2
3
internet@andy-desktop:~$ '/home/internet/Arbeitsfläche/Python4.test.py' 
Die Welt grüßt python2
Die Welt grüßt python3

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Dann passt es ja ☺ - ich würde trotzdem wie frostschutz schon geschrieben hat davon Abstand nehmen das in eine einzige Datei zu packen, sonst kann man die nicht sinnvoll an eine IDE oder einen einzelnen Python-Interpreter verfüttern.

Lae6ge6k

(Themenstarter)

Anmeldungsdatum:
19. Februar 2013

Beiträge: 566

Sollte niemand wiedersprechen oder eine andere passendere Lösung für mein Problem haben, so ist dieses Thema gelöst. Noch einmal vielen Dank, an alle mitwirkenden Analytiker. Mit freundlichen grüssen.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

seahawk1986 schrieb:

Encoding von Strings ist in Python etwas, das man verstehen muss

Ich wage das zu ergänzen: Encoding ist etwas, was jeder Entwickler grundsätzlich verstehen muss! 😉

seahawk1986 schrieb:

...bei Python2 ist die Herausforderung einen richtig encodierten String in der Shell ausgeben zu lassen

Also eigentlich ist das in Python3 deutlich schwieriger, da die print-Funktion nur mit Strings (in Python3 also Unicode) arbeitet und keine Bytes (also *encodierte* Strings) ausgeben kann. Intern wird das Default-Encoding des Systems verwendet, was zu Komplikationen führen kann, wenn Shell und OS unterschiedliche Codierungen verwenden. Darüber hinaus unterscheiden diese sich aber primär auch von OS zu OS, was umso schwerer wiegt, weil ich *keine* Aussage darüber mehr treffen kann, ob mein Script auch auf einem anderen System funktioniert.

Das String-Handling an sich ist in Python3 prinzipiell deutlich besser, da es keine zwei gleichartigen und implizit mischbaren Typen mehr gibt, die encodierte und Unicode-Daten schwerer greifbar machen. In Python3 sind Strings immer Unicode und Operationen darauf klappen ergo immer automatisch. Einzig das teilweise schlecht gelöste de- oder encodieren (s. print) trüben die Freude darüber ☹

@ANDREAS 1967 Du solltest Dirch wirklich mal mit dem Konzept von Codierungen von Strings auseinander setzen. Ansonsten wirst Du auf kurz oder lang immer in Schwierigkeiten geraten. Hier mal einige gute Links zu dem Thema:

Wichtigste Regel vorab: UTF-8 != Unicode! 😉 In der Windows-Welt und von vielen uninformierten Menschen hört man dazu immer halbgares Gerede; da wird gerne von 'Unicode' geredet, wenn eigentlich ein Encoding gemeint ist, welches Unicode ohne Verlust darstellen kann, oder auch sehr schlimm von 'ANSI', welches per se überhaupt keine spezielle Codierung darstellt, sondern eigentlich ein Alias für das 'cp1252'-Encoding darstellt. Grauenhaft!

Die Erkenntnis, wie das alles zusammenhängt und was Unicode, was ein Encoding ist und was man wo einsetzen sollte, wird Dein Entwicklerleben nachhaltig *positiv* verändern! ☺

Last but not least:

1
# coding: utf-8

reicht vollkommen aus (bei Python 2)

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Lysander schrieb:

Also eigentlich ist das in Python3 deutlich schwieriger, da die print-Funktion nur mit Strings (in Python3 also Unicode) arbeitet und keine Bytes (also *encodierte* Strings) ausgeben kann. Intern wird das Default-Encoding des Systems verwendet, was zu Komplikationen führen kann, wenn Shell und OS unterschiedliche Codierungen verwenden. Darüber hinaus unterscheiden diese sich aber primär auch von OS zu OS, was umso schwerer wiegt, weil ich *keine* Aussage darüber mehr treffen kann, ob mein Script auch auf einem anderen System funktioniert.

Ja, da gibt es dann entsprechende Workarounds, wenn man Bytes mit einem bestimmten Encoding rausschreiben lassen will - bislang gefunden habe ich unter anderem:

1
2
3
4
5
def printRAW(*Text, coding='utf8'):  
    RAWOut = open(1, 'w', encoding=coding, closefd=False)  
    print(*Text, file=RAWOut)  
    RAWOut.flush()  
    RAWOut.close()   
PYTHONIOENCODING=utf-8:surrogateescape python3 somescript.py
1
2
import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8')
1
2
3
def make_streams_binary():
    sys.stdin = sys.stdin.detach()
    sys.stdout = sys.stdout.detach()

Eigentlich muss man ja sowieso immer wissen mit welchem Encoding die Daten reinkommen und wie sie wieder rausgehen sollen. Wäre ja zu einfach, wenn man sich mal auf UTF-8 einigen könnte...

pascoli

Anmeldungsdatum:
5. Mai 2008

Beiträge: 124

Was mich mal interessieren würde, funktioniert das überhaupt mit dem Umschalten in Zeile 4 von Python2 nach Python3? Ich dachte #! geht nur in der allerersten Zeile.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Ich denke nicht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/bin/env python2
# -*- encoding: utf-8 -*-
import sys
print u'Die Welt grüßt python2'
print sys.version

#!/usr/bin/env python
import sys
print('Die Welt grüßt python3')
print(sys.version)

ergibt ausgeführt:

./test.py
Die Welt grüßt python2
2.7.5 (default, Sep  6 2013, 09:55:21)
[GCC 4.8.1 20130725 (prerelease)]
Die Welt grüßt python3
2.7.5 (default, Sep  6 2013, 09:55:21)
[GCC 4.8.1 20130725 (prerelease)]

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

#! ist nur in der ersten Zeile was besonderes. Und dann auch nur wenns direkt am Zeilenanfang steht.

Antworten |