Seite 1 von 1

ein b'vor dem string'

Verfasst: Mittwoch 5. August 2009, 13:49
von Bluekobalt
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

Verfasst: Mittwoch 5. August 2009, 14:03
von sma
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

Verfasst: Mittwoch 5. August 2009, 14:29
von Bluekobalt
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??

Verfasst: Mittwoch 5. August 2009, 14:44
von cofi
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.

Verfasst: Mittwoch 5. August 2009, 19:06
von Leonidas
Bluekobalt hat geschrieben:Wo trifft man so etwas im wirklichen Leben??
Versuchs mal mit einem Python-Usertreffen :)

Verfasst: Mittwoch 5. August 2009, 19:25
von derdon
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.

Verfasst: Sonntag 9. August 2009, 20:50
von Dill
nein. wir sind die roboter!

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