ein b'vor dem string'

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.
Antworten
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

Liebste Pythongemeinde,

ich habe mal wieder ein "unlösbares" Problem und zwar :
Ich möchte eine Versionsnummerabfrage machen, dazu folgender Code:

Code: Alles auswählen

class ExeWrapper():
    def __init__(self, PI_Exe):
        self.exename    = PI_Exe
        self.args       = []
        self.proc       = 0
        self.stdoutput  = []
        self.stderr     = []

    def AddArg( self, PI_Arg ):
        self.args.append( PI_Arg )

    def Run(self):
        args = []
        args.append( self.exename )
        args.extend( self.args )
        self.proc = subprocess.Popen( args, stdout=subprocess.PIPE,  stderr=subprocess.PIPE)
        self._ReadStdOutErr()

    def _ReadStdOutErr(self):
        for line in self.proc.stdout:
            print( "Line: ", line.rstrip() )
            self.stdoutput.append( line.rstrip() )

        #self.stdoutput  = [line.rstrip() for line in self.proc.stdout]
        self.stderr     = [line.rstrip() for line in self.proc.stderr]

    def GetStdOut(self):
        txt=""
        #print(self.stdoutput)
        #print(txt)
        #txt.join( self.stdoutput )
        for ll in self.stdoutput:
            txt = txt + str(ll)
        return txt

    def GetStdErr(self):
        return "\n".join( self.stderr )

    def ShowCommand(self):
        args = [ self.exename ]
        args.extend( self.args )
        print ( '|'.join( args ) )

#--------------------------------------------------------------------------------
oProg = ExeWrapper( "C:/tmp/GetVersionInfo.exe" );

oProg.AddArg( "-?" )
#oProg.AddArg( "hierist derpfadzur.exe" )
oProg.ShowCommand()
oProg.Run()
print( oProg.GetStdOut() )
dummerweise sieht die Ausgabe dann z.B. so aus:
Line: b'GetVersionInfo - Retrieve information about an exe/dll file'

Ich vermute, dass das 'b' für binary steht.
In der Version 2.5 tritt dieses Problem nicht auf, jedoch in 3.1
Ich habe wirklich keine Ahnung wie ich das simpel wegbekommen.
Vielen Dank im Voraus für diese Mühe
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Python 3.1 unterscheidet (korrekt) zwischen Zeichenketten (str) und Bytearrays (bytes). Letzte werden mit einem b gekennzeichnet. In Python 2.x waren echte Strings nur mit dem Datentyp unicode zu erreichen und str stand für Bytestrings, die sowohl als Bytearrays als auch als in einem Byte-Encoding vorliegende Strings benutzt. Sie stammen aus einer Zeit, wo 7-Bit ASCII noch ausreichte, um alle Zeichen einer Zeichenkette abzubilden. Heutzutage definiert der Unicode-Zeichensatz aber 100.000+ Zeichen, die 2 (für die Basic-Plane) oder gar 4 Bytes pro Unicode-Point brauchen und einige Zeichen sind sogar aus mehreren Zusammengesetzt, ein ä etwa aus a und ¨ (decomposed encoding).

Deine Funktion liefert also offenbar ein bytes-Objekt zurück, dass du dann zu einem String machen musst. Dazu musst du das Encoding kennen. Sagen wir, es ist CP1252. Dann wäre es `s = b.decode("cp1252")`.

Mich wundert (ohne genau den Code zu verstehen) übrigens das `str` in Zeile 34. Das halte ich für falsch. Ich vermute, dass du aus stdout bytes ausliest und die kannst du nicht einfach mit str() zu einem String machen, da dies einem repr() entspricht und das eben die Repräsentation für Entwickler ausgibt. Stattdessen musst du das Encoding kennen, welches dein Programm annimmt, dass es die Konsole hat, in die es glaubt zu schreiben.

Stefan
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

Hallo Stephan,
danke erst einmal für deine Hilfe.
Das mit dem str Parsen war nur ein verzweifelter Versuch Python auf meine Seite zu zwingen.

An Alle Forums teilnehmer : Ihr seid wirklich Klasse ! Schnell und Kompetent !
Wo trifft man so etwas im wirklichen Leben??
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Bluekobalt hat geschrieben:An Alle Forums teilnehmer : Ihr seid wirklich Klasse ! Schnell und Kompetent !
Wo trifft man so etwas im wirklichen Leben??
Erm .. hier?

Der obligatorische Hinweis auf PEP 8 darf natuerlich nicht fehlen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Bluekobalt hat geschrieben:Wo trifft man so etwas im wirklichen Leben??
Versuchs mal mit einem Python-Usertreffen :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

cofi hat geschrieben:
Bluekobalt hat geschrieben:An Alle Forums teilnehmer : Ihr seid wirklich Klasse ! Schnell und Kompetent !
Wo trifft man so etwas im wirklichen Leben??
Erm .. hier?
Da muss ich cofi unterstützen! Warum denken so viele Menschen, dass Internet wäre eine virtuelle Welt? Das Internet *ist* real. Es befindet sich im wirklichen Leben.

So, das musste mal gesagt werden.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

nein. wir sind die roboter!

http://www.youtube.com/watch?v=R23e9VO_vOI
http://www.kinderpornos.info
Antworten