Frage zu `subprocess`

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Ich bin jetzt dabei, das "Allround"-Modul, für die Verwendung externer Programme z.B. über die Konsole `subprocess` zu benutzen.

Funktioniert ansich ganz gut...

Habe mir mal ein kleines Script zusammengehackt, welches meinen 'libary' Ordner (alles Sachen aus verschiedenen SVN Repos) aktualisiert und wenn die 'lib' ne `setup.py` hat, wird die auch ausgeführt.

Das ganze schaut jetzt einfach mal so aus:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import os, subprocess, sys
m_pth = sys.path[0]

def read_dir(path):
    dirs = [dir for dir in os.listdir(path)
            if not dir.startswith('.')]
    return dirs

def update_dir(dirname):
    print '---------- Update %s ----------' % dirname
    pr = subprocess.Popen(('svn update %s' % dirname), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    print pr.communicate()[0]
    if os.path.exists(os.path.join(dirname, 'setup.py')):
        print 'installiere...'
        os.chdir(dirname)
        pr = subprocess.Popen(('sudo python setup.py install'),
                             shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        print pr.communicate()[0]
    os.chdir(m_pth)

def main():
    dirs = read_dir(os.path.curdir)
    print dirs
    for dir in dirs:
        update_dir(dir)

if __name__ == '__main__':
    main()
Jetzt ist mir aber aufgefallen, das sämtliche Ausgaben auf der Konsole nicht "Live" geschehen, sondern in ``pr.communicate()`` "zwischengespeichert" werden.

Geht auch eine 'Live'-Ausgabe? Und wenn ja, wie?

MfG EnTeQuAk
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das liegt IMHO nicht an subprocess, sondern an den Programmen die Aufgerufen wurden. Wenn diese kein stdout.flush() machen, dann erhälst du die Ausgaben erst nach Beendigung...

Such mal nach "subprocess und flush", da gibt es ein paar Threads drüber...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

EnTeQuAk hat geschrieben:Geht auch eine 'Live'-Ausgabe? Und wenn ja, wie?
Hi EnTeQuAk!

Dass es an den aufgerufenen Programmen liegt und du dieses Verhalten nicht beeinflussen kannst, weißt du ja schon von Jens.
Wenn du aber ein Python-Programm aufrufst, dann hast du Glück. Du kannst Python mit dem Parameter "-u" aufrufen, dann wird die Ausgabe nicht gebuffert. Das betrifft jetzt das **aufgerufene** Python-Programm und nicht dein aufrufendes Programm.

So könnte es funktionieren:

Code: Alles auswählen

"sudo python -u setup.py install"
Das ist nur ein String und kein Tupel: :-)

Code: Alles auswählen

('sudo python -u setup.py install')
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja, denn Subprocess aufrufen geht optimalerweise etwa so.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Oki ;) Dann wird es wohl an SVN liegen :'(

Aber wenigstens habe ich nun ne schönere Ausgabe des installierens ;)


Danke!

MfG EnTeQuAk
Antworten