dabear Skrevet 22. august 2005 Del Skrevet 22. august 2005 (endret) Ok, nå sliter jeg. Jeg skal drive litt manipulering av output fra en kommando jeg kjører gjennom subprocess.Popen . Jeg har sett på Popen sin «communicate»-metode, men den gir kun en stdout, og stderr-tuple. Hvordan kan jeg bufre outputen fra Popen og legge den i manipObj? #! /usr/bin/python # -*- encoding: iso-8859-1 -*- from subprocess import * import sys def ExecuteProgram(program, args): try: retcode = Popen(program + ' ' + args, shell=True) #if retcode < 0: # print >>sys.stderr, "Child was terminated by signal", -retcode #else: # print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e return retcode if __name__ == '__main__': #ønsker å bufre all output, og legge det i manipObj manipObj = ExecuteProgram('ls', '-lh') print '\n\nreturns:', manipObj Endret 22. august 2005 av dabear Lenke til kommentar
A_N_K Skrevet 22. august 2005 Del Skrevet 22. august 2005 Du kan bruke Popen-objektet, det har attributter for standardfilene, dvs. stdin, stdout og stderr. Lenke til kommentar
dabear Skrevet 22. august 2005 Forfatter Del Skrevet 22. august 2005 Du kan bruke Popen-objektet, det har attributter for standardfilene, dvs. stdin, stdout og stderr. Det var jo akkurat det jeg ikke skjønte hvordan jeg skulle gjøre, mulig jeg forklarte meg dårlig. Hvordan forteller jeg stdout-attributet at output skal legges til en variabel, for deretter å returneres? Jeg har prøvd dette: #! /usr/bin/python # -*- encoding: iso-8859-1 -*- from subprocess import * import sys def ExecuteProgram(program, args): hey='' try: retcode = Popen('/usr/bin/' + program + ' ' + args, stdout=hey).communicate()[0] #if retcode < 0: # print >>sys.stderr, "Child was terminated by signal", -retcode #else: # print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e return hey if __name__ == '__main__': #ønsker å bufre all output, og legge det i manipObj obj = ExecuteProgram('ls', '-lh') print '\n\nreturns:', obj Både ved å definere hey i- og utafor funksjonen, da får jeg denne feilmeldinga: bjorninge@laptopBearUbuntu:~/python$ python ls.py Traceback (most recent call last): File "ls.py", line 20, in ? obj = ExecuteProgram('ls', '-lh') File "ls.py", line 9, in ExecuteProgram retcode = Popen('/usr/bin/' + program + ' ' + args, stdout=hey).communicate()[0] File "/usr/lib/python2.4/subprocess.py", line 549, in __init__ (p2cread, p2cwrite, File "/usr/lib/python2.4/subprocess.py", line 856, in _get_handles c2pwrite = stdout.fileno() AttributeError: 'str' object has no attribute 'fileno' bjorninge@laptopBearUbuntu:~/python$ Lenke til kommentar
dabear Skrevet 22. august 2005 Forfatter Del Skrevet 22. august 2005 Jeg har vel egentlig nå skjønt at stdout må være ei fil. Jeg prøver å få det til, men det viser seg at ingenting blir returnert. vært flott om noen kunne hjelpe. #! /usr/bin/python # -*- encoding: iso-8859-1 -*- from subprocess import * import sys, random, os def ExecuteProgram(program, args): fileName = '/tmp/lsRandFile%s' % random.randrange(1000) try: tempfile = file(fileName, 'w+') try: retcode = Popen(program + ' ' + args, shell=True, stdout=tempfile).communicate()[0] except OSError, e: print >>sys.stderr, "Execution failed:", e coutVal = tempfile.read() tempfile.close() os.remove(fileName) except IOError, e: print >>sys.stderr, 'kunne ikke lese/skrive fil,', e return coutVal if __name__ == '__main__': #ønsker å bufre all output, og legge det i obj obj = ExecuteProgram('ls', '-lh') print '\n\nreturns:', obj All output jeg nå får nå, er bjorninge@laptopBearUbuntu:~/python$ python ls.py returns: bjorninge@laptopBearUbuntu:~/python$ Lenke til kommentar
A_N_K Skrevet 22. august 2005 Del Skrevet 22. august 2005 Du bør heller bruke en pipe for kommunikasjon med prosessen, dvs. spesifiser stdout=PIPE (en subprocess-konstant) i kallet til Popen-konstruktøren. Metoden communicate() returnerer heller ingen returkode, men output fra stdout og stderr (i en tuple). Lenke til kommentar
dabear Skrevet 22. august 2005 Forfatter Del Skrevet 22. august 2005 (endret) Jaok, men jeg får jo fortsatt ikke til å returnere innholdet av ls -lh i en variabel, det er det jeg prøver å få til. Forå sitere phpmanualen, er det noe liknende jeg vil få til i python: Execute command via shell and return the complete output as a string Veit ikke om det var dét du mente med subprocess.PIPE, men jeg forstår ikke hvordan jeg får henta ut innholdet. edit: glem det, jeg forstod hva du mente nå. Slk blei det: #! /usr/bin/python # -*- encoding: iso-8859-1 -*- from subprocess import * import sys, random, os def ExecuteProgram(program, args): try: ret = Popen(program + ' ' + args, shell=True, stdout=PIPE).communicate() except OSError, e: print >>sys.stderr, "Execution failed:", e return ret if __name__ == '__main__': #ønsker å bufre all output, og legge det i manipObj obj = ExecuteProgram('ls', '-lh') print '\n\nreturns:', obj[0] Endret 22. august 2005 av dabear Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå