Pygments geht nicht..

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Ich bin gerade extrem gestresst, denn ich muss es noch heute irgendwie schaffen meinen ganzen Quellcode in Word darzustellen. Ich habe dieses Problem schon ein einem anderen Thread angedeutet, die Fragestellung war jedoch anders und ich bin noch zu keiner Lösung gekommen. Mein Problem ist, dass ich mit pygments versuche meinen Quellcode in RTF umzuwandeln und in Word darzustellen. Wenn ich jedoch den Befehl

Code: Alles auswählen

pygmentize -f rtf /Users/camilltrueb/Documents/Python/drawmax1.py
im Terminal eingebe, kommt folgende Fehlermeldung:

Code: Alles auswählen

*** Error while highlighting:
TypeError: ord() expected a character, but string of length 2 found
   (file "/Library/Python/2.7/site-packages/Pygments-1.4-py2.7.egg/pygments/formatters/rtf.py", line 77, in _escape_text)
{\rtf1\ansi\deff0{\fonttbl{\f0\fmodern\fprq1\fcharset0;}}{\colortbl;\red128\green128\blue128;\red186\green33\blue33;\red0\green64\blue208;\red102\green102\blue102;\red64\green128\blue128;\red160\green160\blue0;\red25\green23\blue124;\red0\green128\blue0;\red187\green102\blue136;\red187\green102\blue34;\red136\green0\blue0;\red170\green34\blue255;\red153\green153\blue153;\red0\green160\blue0;\red160\green0\blue0;\red255\green0\blue0;\red128\green0\blue128;\red176\green0\blue64;\red0\green0\blue255;\red187\green187\blue187;\red188\green122\blue0;\red0\green0\blue128;\red125\green144\blue41;\red210\green65\blue58;}\f0{\cf8\b def} {\cf19 drawmax}(draws, tries {\cf4 =} {\cf4 10000}): {\cfcamill-truebs-macbook:~ camilltrueb$ 
Ich verwende Python 3.2.2 und ich habe keine Ahnung was ich falsch gemacht habe... Kann mir irgendwer helfen? Danke im voraus :)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Der Fehler tritt in der Zeile mit dem zweiten "if" auf.

Code: Alles auswählen

for c in text:
    if ord(c) > 128:
        ansic = c.encode(encoding, 'ignore') or '?'
        if ord(ansic) > 128:
            ansic = '\\\'%x' % ord(ansic)
        else:
            ansic = c
Die Schleife will wohl Zeichen mit einem Codepoint > 128 (was IMHO > 127 sein müsste) mit "\'xx" umschreiben, damit gültiges RTF bleibt. Nun kann es aber natürlich passieren, dass "ansic", wenn man "c" mit einem Encoding wie UTF-8 kodiert, gar kein ANSI-Zeichen ist, sondern eben eine UTF-8-Bytesequenz mit 2 oder 3 Zeichen Länge. Ich rate mal, genau das passiert.

Das Encoding wird kurz vor der Schleife so berechnet:

Code: Alles auswählen

if self.encoding in ('utf-8', 'utf-16', 'utf-32'):
            encoding = 'iso-8859-15'
        else:
            encoding = self.encoding or 'iso-8859-15'

Im Prinzip ist es also iso-8859-15, außer es ist etwas anderes als eine utf-Variante. Rutscht da bei dir vielleicht etwas wie "utf-16BE" rein? Oder auch nur "UTF-8" in Großbuchstaben?

Ich vermute doch, das Encoding gibt man in der Kommandozeile an oder übergibt es per Umgebungsvariable. Damit würde ich dann mal spielen.

Oder schmeiße aus deinem Quelltext Umlaute und andere Sonderzeichen raus.

Stefan
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Ich muss ehrlich sagen, dies waren meine ersten Erfahrungen mit Python. Ich hatte keine Zeit das ganze Tutorial durchzuarbeiten und habe mich auf die für mich relevanten Punkte beschränkt. Folglich verstehe ich von dem, was du mir versuchst zu sagen, sehr wenig :S. Was ich sagen kann, ist, dass ich ziemlich viele Grossbuchstaben drin habe. Es wäre aber eine riesen Arbeit, diese aus allen meinen Programmen herauszunehmen und auch die schriftliche Arbeit dazu entsprechend abzuändern.
Was hast du also genau mit
Ich vermute doch, das Encoding gibt man in der Kommandozeile an oder übergibt es per Umgebungsvariable. Damit würde ich dann mal spielen.
gemeint? Denn ich vermute ich das ist die Lösung für mein Problem ;). Entschuldige dass ich mich so dumm anstelle... Camill
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mir fällt gerade auf: Du sagst, du benutzt Python 3.2.2, doch im Pfad von pygments steht klar 2.7. Ich vermute, du musst entweder eine Pygments-Version für Python 3 installieren, falls es diese gibt, oder aber besser Python 2.7 benutzen. Dann funktioniert es vielleicht besser.

Stefan
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Stimmt, das habe ich ganz vergessen... Auf http://pygments.org/faq/ steht:
Yes, Pygments should work on Python 3.x. You can use the same source release and run python setup.py install as usually for installation under Python 3.
Aber wie soll das (python setup.py install) gehen? haha ich kommt nicht draus...
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Code: Alles auswählen

\python32\python.exe setup.py install
So in der Art :P
Heißt du gibst erst de Pfad zu deinem Python 3.2 und dann mit Leerzeichen getrennt den Pfad zu der setup.py
Du hast wohl zwei Python Versionen und Python 2.7 ist dein Standard
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also wenn Du das so schnell benötigst, dann installiere Dir doch ein Python 2.7 und hab Spaß an pygments! Beides sollte über jeden Paketmanager einfach möglich sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Ich habe mir Python 2.7 heruntergeladen und installiert, doch es geht immer noch nichts. Ich habe das Gefühl ich habe irgendetwas an Pygments grundsätzlich falsch verstanden, und die Anleitungen im Internes sind auch recht spärlich... Kann mir vielleicht irgenjemand einfach eine kurze Anleitung zu Pygments geben? Also von der Installation bis zur rtf-Umformatierung.... Ich wäre extrem froh darüber. Camill
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also für eine Installation muss man erst mal wissen, welches System Du nutzt. Da es ursprünglich ja um Word ging, nehme ich mal an irgend ein Windows? Dafür gibt es doch ein *.egg iirc. Insofern sollte die Installation leicht von der Hand gehen.

Also schildere uns doch mal, wie die Dinge exakt liegen und was Du so probiert hast.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Ich arbeite auf meinem Mac mit der osx version 10.7. Ich habe Pygments installiert indem ich den Befehl

Code: Alles auswählen

easy_install Pygments
im Terminal eingegeben habe. Dann habe ich versucht mit dem Befehl

Code: Alles auswählen

pygmentize -s rtf x/x/x.py
den Text zu highlighten, hat aber nicht funktioniert. Dann habe ich Python 2.7 heruntergeladen und installiert. Das wars eigentlich...
Camill
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hat das installieren von Pygments denn geklappt? Da Du vorher die falsche Python-Version installiert hattest, dürfte Pygments im falschen Ordner liegen - Du musst es sicherlich noch einmal installieren, nachdem Du Python 2.7 installiert hast. Inwiefern man Einstellungen vornehmen muss, um vor der Installation von Pygments (bzw. jedes anderen Pakets) mitzuteilen, wo die Standard-Python-Version liegt, kann ich nicht sagen - ich kenne mich mit MacOS nicht aus.

Bei den Systemen, die ich kenne, liegen zusätzliche Pakete unterhalb eines Python-Ordners. `pip` "erzählt" einem auch, wo er das Paket ablegt - ich vermute `easy_install` sollte das auch tun.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Hat alles geklappt, habe pygments in 3.2 gelöscht und in 2.7 installiert. Doch es kommt wieder die gleiche Fehlermeldung. Ich denke das Problem liegt doch nicht bei der Version, sondern bei der formatierung. Als ich den quellcode in ein python 2.7-Fenster kopiert habe und gespeichert habe, kam eine Meldung, der Text beinhalte ''non-ascii''-Zeichen oder sowas. Habe sie leider geschlossen und bekomme sie nun nicht mehr.
Sma hatte also vermutlich doch recht, mit den grossgeschriebenen utf-8 zeichen und so. Weiss jemand eine Lösung darauf?
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Ja, es sind definitiv die Grossbuchstaben. Ohne sie geht es. Wie ich bereits gesagt habe, kann ich nicht alls Grossbuchstaben ändern. Weiss jemand eine Lösung, wie ich sie drinbehalten könnte???
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

n3xtplayer hat geschrieben:Ja, es sind definitiv die Grossbuchstaben. Ohne sie geht es. Wie ich bereits gesagt habe, kann ich nicht alls Grossbuchstaben ändern. Weiss jemand eine Lösung, wie ich sie drinbehalten könnte???
Kannst Du da mal präziser sein? Gibt doch mal ein minimales Beispiel, welches bei Dir klappt und eines, welches nicht klappt. Dann kann man das mal zu Hause testen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@n3xtplayer: Hast Du in der Quelltextdatei eine Kodierung angegeben? Steht da zufällig irgendwo ein Kommentar drin, der die Kodierung als 'UTF-8' ausweist — in Grossbuchstaben! Dann ändere mal nur dieses 'UTF' in Kleinbuchstaben. Das meinte sma auch nur — und nicht den gesamten Quelltext.
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Entschuldigung, ich habe mich geirrt. Es sind die Umlaute. Doch nicht die Grossbuchstaben. Falls du immer noch ein Beispiel willst:

Code: Alles auswählen

ä = 2
geht nicht,

Code: Alles auswählen

a = 2
geht. ;) Aber ich denke das ist klar... Muss ich die alle löschen oder gibt es da einen anderen Weg?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, der Fehler tritt bei mir auch auf - allerdings nur mit RTF. Scheint also wirklich ein Problem mit diesem Formatter oder dem Format an sich zu sein.

Also sofern es sich um Kommentare handelt, kannst Du die ja leicht ändern. Sollten es Strings sein, so kannst Du evtl. umformulieren, so dass da keine Umlaute drin auftreten und Du nur ASCII Zeichen hast? Evt. stelle das auf Englisch um? Das wäre ein schneller und einfacher Workaround.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Ok, du hast recht. Ich mache es so. Aber trotzdem bleibt noch eine Frage... Wie stelle ich rtf überhaupt in Word dar?
Ich fühle mich wi ein richtiger Noob bzw. ich bin es auch :S
Ich habe einfach keine Ahnung wie ich Word dazu bringe, einen Code wie

Code: Alles auswählen

{\rtf1\ansi\deff0{\fonttbl{\f0\fmodern\fprq1\fcharset0;}}{\colortbl;\red128\green128\blue128;\red186\green33\blue33;\red0\green64\blue208;\red102\green102\blue102;\red64\green128\blue128;\red160\green160\blue0;\red25\green23\blue124;\red0\green128\blue0;\red187\green102\blue136;\red187\green102\blue34;\red136\green0\blue0;\red170\green34\blue255;\red153\green153\blue153;\red0\green160\blue0;\red160\green0\blue0;\red255\green0\blue0;\red128\green0\blue128;\red176\green0\blue64;\red0\green0\blue255;\red187\green187\blue187;\red188\green122\blue0;\red0\green0\blue128;\red125\green144\blue41;\red210\green65\blue58;}\f0{\cf8\b def} {\cf19 drawmax}(draws, tries {\cf4 =} {\cf4 10000}):\par
    Deck1 {\cf4 =} [{\cf4 2},{\cf4 3},{\cf4 4},{\cf4 5},{\cf4 6},{\cf4 7},{\cf4 8},{\cf4 9},{\cf4 10},{\cf4 10},{\cf4 10},{\cf4 10},{\cf4 11}]\par
    Deck2 {\cf4 =} {\cf4 24} {\cf4 *} Deck1\par
    notexceed {\cf4 =} {\cf4 0}\par
    {\cf8\b for} i {\cf12\b in} {\cf8 range}(tries):\par
        D {\cf4 =} copy{\cf4 .}copy(Deck2)\par
        cards {\cf4 =} {\cf4 0}\par
        Aces{\cf4 =} {\cf4 0}\par
        random{\cf4 .}shuffle(D)\par
        {\cf8\b for} j {\cf12\b in} {\cf8 range}(draws):\par
            {\cf8\b if} D[{\cf4 0}] {\cf4 ==} {\cf4 11}:\par
                Aces {\cf4 =} Aces {\cf4 +} {\cf4 1}\par
            cards {\cf4 =} cards {\cf4 +} D[{\cf4 0}]\par
            D{\cf4 .}remove(D[{\cf4 0}])\par
            {\cf8\b if} Aces {\cf4 >} {\cf4 0}:\par
                {\cf8\b if} cards {\cf4 >} {\cf4 21}:\par
                    cards {\cf4 =} cards {\cf4 -} {\cf4 10}\par
                    Aces {\cf4 =} Aces {\cf4 -} {\cf4 1}\par
        {\cf8\b if} cards {\cf4 <} {\cf4 22}:\par
            notexceed {\cf4 =} notexceed {\cf4 +} {\cf4 1}{\cf5\i #falle, in denen 21 nicht berchreiten wird, werden gezahlt}\par
    {\cf8\b print}(notexceed)\par
darzustellen...
Danke für deine vielen Antworten bis jetzt! Camill
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du kannst das auch per Parameter angeben:

Code: Alles auswählen

pygmentize -l java -f rtf -O encoding=utf-8 < test-umlaut.java > test-umlaut.rtf
Dann klappt es auch mit Umaluten ;-) Doku angucken hilft manchmal viel!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Na, Du kannst doch Unter "Einfügen -> aus Datei" die Datei wählen iirc. Ist schon länger her, dass ich das für meinen Chef an der Uni gemacht habe.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten