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

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
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

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*
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

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 :(
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

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 :( )
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

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
Antworten