Gå til innhold

hente output fra kommandolinja


Anbefalte innlegg

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 av dabear
Lenke til kommentar
Videoannonse
Annonse
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

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

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

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 av dabear
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...