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

Frage zu `subprocess`

Beitragvon EnTeQuAk » Dienstag 3. April 2007, 19:11

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 4. April 2007, 07:46

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Frage zu `subprocess`

Beitragvon gerold » Mittwoch 4. April 2007, 08:28

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 4. April 2007, 08:55

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

Beitragvon EnTeQuAk » Mittwoch 4. April 2007, 09:15

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

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


Danke!

MfG EnTeQuAk

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder