Mehrere Python-Skripte aus einem Skript asuführen

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
Tecumseh
User
Beiträge: 14
Registriert: Samstag 28. April 2012, 11:50

Hey,

ich habe ein denke ich sehr einfach Frage, komme aber einfach auch durch ewiges googeln nicht zu einer Lösung.

Linux-System, Python-Version: 2.6

Ich hab ein Python-Skript geschrieben. Dieses hab ich in verschiedenen Ordnern um unterschiedliche Datensätze auszuwerten.
Jetzt möchte ich diese verschiedenen Skripte gerne einfach nacheinander ausführen, da jedes Programm ca. 1h braucht.
Das Starten der Skripte ist kein Problem, nur leider muss jedes Einzelskript auf Ordner/Dateien/Modulezugreifen die im gleichen Ordner wie das Einzelskript liegen.
Wenn ich also meine "Starter.py" Datei ausführe um nacheinander die Skript1.py, Skript2.py usw. zu starten, dann bekomme ich die Fehlermeldung, dass Ordner/Dateien/Module nicht gefunden wurden. Würde ich diese in den gleichen Ordner wie das "Starter.py" Skript kopieren geht es. Das ist aber schlecht, weil die Ordner eben gerade für jedes Einzelskript auch andere Inhalte haben. Kann mir jemand Helfen?? Das würde mir viel Zeit sparen, denn dann könnte ich einfach über Nacht viele Berechnungen laufen lassen.

mein jetziges Skript sieht so aus:

from os import*


chdir("/home/HKunze/Desktop/Simulation/Ordner1/")
script2run = "Skript1.py"
execfile( script2run )

chdir("/home/HKunze/Desktop/Simulation/Ordner2/")
script2run = "Skript2.py"
execfile( script2run )
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Du kannst das Ganze auch mal mit dem subprocess [1] Modul probieren. Wie das dann mit dem working directory aussieht weiß ich nicht.

[1] http://docs.python.org/library/subprocess.html
Tecumseh
User
Beiträge: 14
Registriert: Samstag 28. April 2012, 11:50

Danke für die fixe Antwort!:)
Ja, darauf bin ich auch schon gestoßen, aber 1. hat man dann denke ich erst recht das Problem mit dem Working Directory und 2. muss ich mir dann sicher auch noch Gedanken machen, dass die Prozesse wirklich hintereinander gestartet werden. Zwei Programme gleichzeitig würden den Arbeitsspeicher sprengen.

Ich hatte gehofft es geht einfacher, das subprocess-Modul ist mir suspekt:)
BlackJack

@Tecumseh: Suspekt sollte Dir eher `os.system()` sein. ;-) Letztendlich stellt sich hier aber die Frage warum Du nicht einfach ein Shell-Skript schreibst. Denn wenn das Python-Skript einzig und allein dazu da ist mit `os.system()` Programme auszuführen, dazu dann auch noch jedes in einer eigenen Systemshell, dann ist das nur unnötig indirekt und komplexer als es sein muss.
Tecumseh
User
Beiträge: 14
Registriert: Samstag 28. April 2012, 11:50

Das Problem ist, dass ich erst mal ne ganze Weile gebraucht habe um mich in Python einzuarbeiten;) Ich hab keine Erfahrungen mit Shell-Befehlen.

Könntest du quasi für diese Problem was aus dem Hut zaubern?:)

Besten Dank!
BlackJack

@Tecumseh: Keine Erfahrung mit Shell-Befehlen heisst Du arbeitest überhaupt nicht auf der Shell? Alles was Du da im Python-Skript machst ist in das Arbeitsverzeichnis wechseln und Skripte ausführen [1]_. Wenn Du das auf der Kommandozeile kannst, dann kannst Du das auch in ein Shell-Skript schreiben:

Code: Alles auswählen

#!/bin/sh

cd /home/HKunze/Desktop/Simulation/Ordner1/
./Skript1.py

cd /home/HKunze/Desktop/Simulation/Ordner2/
./Skript2.py
Andererseits könntest Du das aber auch in Python schreiben und dabei ein wenig von Python's Vorteilen benutzen, wie beispielsweise ordentliche Datenstrukturen die man auch verschachteln kann. Dann kannst Du gemeinsamen Teil der Pfade zu den Ordnern in einer Konstanten ablegen, die Skriptnamen und ihre spezifischen Unterordner in Tupeln zusammenfassen und in eine Liste stecken und dann in einer Schleife darüber iterieren und sie mit `subprocess.call()` ausführen.

Sternchen-Import sollte man vermeiden. Pfade immer mit den Funktionen in `os.path()` manipulieren. Wenn die Skripte mit der gleichen Python-Version ausgeführt werden sollen wie die vom Starterskript, schau Dir mal `sys.executable` an. Und für das Arbeitsverzeichnis kennt `subprocess.call` ein Schlüsselwort-Argument, welches bei `subprocess.Popen()` dokumentiert ist.

.. [1] Das stimmt so nicht ganz, aber von `execfile()` würde ich hier auch abraten. Die Module werden im Kontext des Moduls ausgeführt, das `execfile()` aufruft, also im Grunde so als wenn deren Inhalt direkt in dem Modul stünde.
Tecumseh
User
Beiträge: 14
Registriert: Samstag 28. April 2012, 11:50

Jaa! Das ist denke ich genau das was ich brauche!

Aber wenn ich jetzt die Shell-Datei (Starter.sh) ausführe (im Terminal einfach mit ./Starter.sh) kommt folgender Fehler:
"from: can't read /var/mail/pylab"

Ich hab die beiden Skripte die gestartet werden sollen als ausführbare Programme definiert. Also da ein Häckchen bei Eigenschaften rein gemacht.

Muss ich sonst noch etwas beachten?
Tecumseh
User
Beiträge: 14
Registriert: Samstag 28. April 2012, 11:50

Ahhh!

Alles klar....man muss es natürlich tatsächlich so eingeben wie auch sonst in der Konsole, also nach dem wechseln des Ordners:
python Skript1.py


Danke für die schnelle Hilfe! Das hilft ungemein!!
Philipp
BlackJack

@Tecumseh: Du kannst auch ``./Skript.py`` eingeben — nur sollte es dann auch ein entsprechendes Python-Skript sein mit der passenden ersten Zeile die angibt *womit* das ausgeführt werden soll. Ausführrechte alleine reichen nicht aus: http://docs.python.org/using/unix.html#miscellaneous
Tecumseh
User
Beiträge: 14
Registriert: Samstag 28. April 2012, 11:50

Jupp! Geht wunderbar!

Herzlichsten Dank noch mal!
Antworten