Seite 1 von 1

Frage zu `subprocess`

Verfasst: Dienstag 3. April 2007, 19:11
von EnTeQuAk
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

Verfasst: Mittwoch 4. April 2007, 07:46
von jens
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...

Re: Frage zu `subprocess`

Verfasst: Mittwoch 4. April 2007, 08:28
von gerold
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
:-)

Verfasst: Mittwoch 4. April 2007, 08:55
von Leonidas
Ja, denn Subprocess aufrufen geht optimalerweise etwa so.

Verfasst: Mittwoch 4. April 2007, 09:15
von EnTeQuAk
Oki ;) Dann wird es wohl an SVN liegen :'(

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


Danke!

MfG EnTeQuAk