Avatar billede cronck Nybegynder
06. juli 2012 - 13:47 Der er 4 kommentarer og
1 løsning

Python: Custom stdout

Jeg bruger pt. pexpect i mit script, til at uploade filer med, via. SCP.

Variablen htmlOut er enten 0 eller 1, alt afhængigt af om scriptet bliver kaldt via CGI/Web eller via shell.

Hvis jeg overskriver sys.stdout instancen med min egen StdOut som tilføjer "<br />" til hver linie.
Bruger jeg den "originale" sys.stdout uden at overskrive, virker koden fint.

Årsagen til at jeg vil overskrive funktionen, er at PExpect ikke laver HTML linebreaks, når den sender outputtet fra SCP-kaldet.

PExpect kode:
child = pexpect.spawn ('scp "/home/daniel/p/'+filename+'" '+ user +'@'+ IP +':/tmp')
child.expect ('password:')
child.sendline (passwd)
child.logfile = sys.stdout

child.expect('100%', timeout=3600)


StdOut kode:

class StdOut(object):
    global  htmlOut
    def __init__(self,txtctrl):
        self.txtctrl = txtctrl
    def write(self,string):
        if hmtlOut == 1:
            self.txtctrl.write('<br />'+ string)
        else:
            self.txtctrl.write(string)

sys.stdout = StdOut()

Nogen der kan hjælpe med at få det til at virke? :)
Avatar billede arne_v Ekspert
07. juli 2012 - 03:36 #1
Det her ser ud til at virke:

import sys

class brwrapper(object):
    def __init__(self,oldstdout):
        self.oldstdout = oldstdout
    def write(self,txt):
        self.oldstdout.write(txt.replace('\n', '<br/>\n'))
    def restore(self):
        return self.oldstdout

print 'ABC'
print 'DEF'
sys.stdout = brwrapper(sys.stdout)
print 'ABC'
print 'DEF'
sys.stdout = sys.stdout.restore()
print 'ABC'
print 'DEF'
Avatar billede cronck Nybegynder
07. juli 2012 - 14:09 #2
Tusind tak :)

jeg ser om ikke jeg kan få startet min laptop op i løbet af dagen, og teste det.
Avatar billede cronck Nybegynder
09. juli 2012 - 08:09 #3
Det virker fint med "print".

Men når PExpect kalder sys.stdout laver den ikke nogen "<br />" tags.

Når det kører igennem Shell, overskriver outputtet fra SCP den samme linie igen og igen, går udfra at det er dét som er det egentlige problem?

Når det kaldes via CGI sender den en ny linie for hver gang SCP opdaterer outputtet, selvfølgelig uden at overskrive den tidligere linie, da det jo ikke kan ske via HTTP. :)
Avatar billede cronck Nybegynder
07. august 2012 - 10:05 #4
Havde helt glemt det her spg...
Arne, du må meget gerne smide et svar. Bruger funktionen i stor stil. :)

Nåede aldrig helt at få den til at formatere SCP outputtet, men tror at det skyldes at den faktisk ikke sender \n efter hver besked, hvilket jeg jo nemt ville kunne tilføje med funktionen ovenfor.
Avatar billede arne_v Ekspert
07. august 2012 - 14:36 #5
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester