Seite 1 von 1

.bat-datei aufrufen, die andere programme startet und warten

Verfasst: Mittwoch 5. September 2007, 13:34
von BigBo
Hallo an euch Pythonliebhaber

ich bin hier echt am verzweifeln wäre nett wenn hier jemand ne lösung für mich hätte.

mein problem:
ich arbeite mit python unter windows und ich will aus einem pythonscript herraus ein .bat datei starten, diese startet wiederum mehrere andere prozesse. ich MUSS warten, bis ALLE aufgerufenen prozesse fertig sind...dies klappt allerdings nicht :-(

hier mal der code:

Code: Alles auswählen

            batchfilename = os.getcwd() + '\\tmp\\convert_' + model + '.bat'
            with open(batchfilename, 'w') as batchfile:
                batchfile.write('start /WAIT ' + proeDir + ' -g:no_graphics +eai_batch:'  + os.getcwd() + '\\tmp\\' + model + '_config')
                batchfile.close()
                
            #finally start the batch file
            aufruf = 'start /WAIT ' + proeDir + ' -g:no_graphics +eai_batch:'  + os.getcwd() + '\\tmp\\' + model + '_config'
            returncode = subprocess.Popen(batchfilename)
ich hab schon mit allen möglichen sachen rumprobiert, os.spwanl, CMD aufrufen und mit der option /C zu arbeiten, die optionen als argumente in der os.spwanl() funktion zu übergeben, programmstart UND argumentübergabe in nen string zu packen, mit subprocess.call(), os.system(), usw.

aber es wartet einfach nicht...was ich auch mache und versuche...in der kommandozeile kommt sofort die neue eingabeaufforderung und mein pythonscript läuft weiter, es soll allerdings warten bis alles beendet ist !

sitz da etzt schon seit stunden davor und probier rum...bitte bitte erlöst mich gebt mir nen lösungsvorschlag *anfleh*

falls noch fragen und unklarheiten zu meinem problem sind gebe ich gerne weitere auskünfte ;-)

schonmal vielen dank und liebe grüße
BigBo

Re: .bat-datei aufrufen, die andere programme startet und wa

Verfasst: Mittwoch 5. September 2007, 13:58
von gerold
BigBo hat geschrieben:

Code: Alles auswählen

            #finally start the batch file
            aufruf = 'start /WAIT ' + proeDir + ' -g:no_graphics +eai_batch:'  + os.getcwd() + '\\tmp\\' + model + '_config'
            returncode = subprocess.Popen(batchfilename)
Hallo BigBo!

Willkommen im Python-Forum!

Die Python-Seite ist in deinem Fall recht einfach:

Code: Alles auswählen

process = subprocess.Popen(batchfilename)
process.wait()
...
mfg
Gerold
:-)

Verfasst: Mittwoch 5. September 2007, 14:20
von BigBo
hallo und danke gerold!

leider ist es doch nicht so einfach :( mit deinem tipp öffnet sich nur n neues konsolenfenster und das programm läuft darin weiter, auch ohne zu warten :(

hab auch versucht das 'start /WAIT' rauszumachen, allerdings zeigt er mir dann den befehl an den ich in die .bat datei mit

Code: Alles auswählen

 batchfile.write('start /WAIT ' + proeDir + ' -g:no_graphics +eai_batch:'  + os.getcwd() + '\\tmp\\' + model + '_config')
geschrieben habe an und zeigt mir sofort wieder ne eingabeaufforderung an...*seufz*

Verfasst: Mittwoch 5. September 2007, 14:37
von Rebecca
Gerolds Code oben wartet auf das Beenden der Batch-Datei. Wenn die Batch-Datei aber nicht auf Beenden der von ihr aufgerufenen Programme wartet, kannst du da mit Python "von aussen" auch nichts dran aendern.

Verfasst: Mittwoch 5. September 2007, 14:41
von BigBo
Gerolds Code oben wartet auf das Beenden der Batch-Datei. Wenn die Batch-Datei aber nicht auf Beenden der von ihr aufgerufenen Programme wartet, kannst du da mit Python "von aussen" auch nichts dran aendern.
haargenau mein problem erfasst rebecca :) aber wie könnte man des lösen ? mit dem 'start /WAIT' beispielsweise versuch ich ja schon über kommandozeilen befehle warten zu lassen...bringt aber nix :(

Verfasst: Mittwoch 5. September 2007, 15:10
von gerold
BigBo hat geschrieben:mit dem 'start /WAIT' beispielsweise versuch ich ja schon über kommandozeilen befehle warten zu lassen...bringt aber nix
Hallo BigBo!

Du kannst dir eine BATCH-Datei (=Stapelverarbeitungsdatei) erstellen und dann von Python aus diese eine Stapelverarbeitungsdatei (CMD oder BAT) ausführen lassen.
Eine BATCH-Datei heißt so, weil ein Befehl nach dem anderen vom Stapel abgearbeitet wird. Da brauchst du nicht irgendwie mit "START /WAIT" arbeiten.

Diese BATCH-Datei kannst du aufrufen, in dem du den kompletten Pfad zu dieser Datei an subprocess.Popen übergibst. Falls es nicht funktioniert, dann musst du als ersten Parameter noch "cmd" mit angeben.

Du kannst aber auch die Befehle nacheinander aus Python heraus abarbeiten lassen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import subprocess

JOBLIST = (
    ("cmd", "/C", "dir"),
    ("cmd", "/C", "echo hallo"),
    ("cmd", "/C", "echo servus"),
)


def main():
    
    for job in JOBLIST:
        proc = subprocess.Popen(job)
        proc.wait()


if __name__ == "__main__":
    main()
EDIT:

Nachtrag:

Code: Alles auswählen

    batchfile_name = "my_batchfile.cmd"
    batchfile = file(batchfile_name, "w")
    batchfile.write(
        "@echo off\n"
        "echo Servus\n"
        "echo aus Tirol\n"
    )
    batchfile.close()
    
    proc = subprocess.Popen([batchfile_name])
    proc.wait()
mfg
Gerold
:-)

Verfasst: Mittwoch 5. September 2007, 15:47
von BigBo
auch dein neuer vorschlag bringt nix @gerald :( bringt nix...noch n kleines update: die programmaufrufstruktur ist etwas SEHR verworren:

python --> meineDatei.bat --> nochEine.bat --> Programm.exe

wobei meineDatei.bat und nochEine.bat , wie von Rebecca beschrieben, nicht auf das beenden der von ihnen aufgerufenen programme warten.

habe schon versucht, den aufruf simpler zu gestalten und 1 oder 2 aufrufschritte wegzulassen, was aber nichts bringt. hab auch in jede start /WAIT (ja gerald ich weiss das des nicht deinem ratschlag entspricht ;) )

so weitere experimente mach ich dann morgen, jetzt ist erstmal feierabend angesagt :) aber bitte weiterhin schön posten bin für jede antwort dankbar...wie gesagt...ich bin am verzweifeln (zusammen mit dem rest der abteilung :( )

Verfasst: Freitag 7. September 2007, 11:45
von BigBo
so hab das problem jetzt auf eine etwas alternative art gelöst...ist zwar nicht sauber aber es geht nicht anderst...sie zu meiner lösung dieses thema:
http://www.python-forum.de/topic-11870.html