Kindprozesse erzeugen

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
mnietz
User
Beiträge: 14
Registriert: Mittwoch 5. März 2003, 11:06
Wohnort: Berlin

Hallo Leute

ich will aus meinem Skript einen Prozeß starten, der auch noch nach dem Skript lebt. Da fällt einem natürlich gleich fork ein.
Meine Frage: gibt es Bord-Mittel in Python mit denen ein Fork OS-unabhängig durchgeführt werden kann.

Beim Foren durchsuchen stoß ich dabei immer auf

os.fork()

In meiner os - lib gibts das nicht.

Warum nur?


Gruß,

Matthias
mnietz
User
Beiträge: 14
Registriert: Mittwoch 5. März 2003, 11:06
Wohnort: Berlin

Hm, scheint so als ob es fork nur unter Unix gibt.
Aber vielleicht kann man ja auch anders zum Ziel kommen.
Mein Problem ist das ich aus meinem Skript 10 andere Prozesse ins Leben rufen will ohne auf deren Ende zu warten. Also os.popen(), os.exec*() und os.system() scheinen mir da nicht zu helfen, weil die eben auf jeden Kindprozess warten oder sogar meinen Prozeß ganz ersetzen. Hat jemand einen Vorschlag, (auch unter Benutzung von fork, dann muss ich halt die Entwicklungsplattform wechseln),

Vielen Dank

mn.
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München

Wenn Du unter Windows bleiben willst, und auf Plattformübergreifende Lösungen verzichten kannst:

Code: Alles auswählen

os.system('start DeinProgramm')
Der Prozess start ist fertig, sobald das Programm läuft, also arbeitet Python dann da weiter.
mfg,

10011110
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

ASCII158 hat geschrieben:Wenn Du unter Windows bleiben willst, und auf Plattformübergreifende Lösungen verzichten kannst:

Code: Alles auswählen

os.system('start DeinProgramm')
Der Prozess start ist fertig, sobald das Programm läuft, also arbeitet Python dann da weiter.
stimmt leider nicht ganz. wenn ich unter windows "ping -t www.yahoo.com" mache, dann wartet python bis der fertig ist und das wird niemals sein. Python wartet, weil es zurückgibt, ob das Programm fehlerfrei beendet wurde (rückgabe 0) oder nicht (alle anderen Werte).
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Milan hat geschrieben: stimmt leider nicht ganz. wenn ich unter windows "ping -t www.yahoo.com" mache, dann wartet python bis der fertig ist und das wird niemals sein.
Ich habe das eben mal unter W2k getestet, und ein os.system("start ping -t www.yahoo.com") läßt Python sofort wieder an den Prompt zurückkehren, und das ping läuft auch nach Beendigung von Python weiter.

Jörg
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

hmm... mit dem "start" vorneweggesetzt stimmt das. Ich dachte das wäre nur ne Umschreibung gewesen.. :roll: :oops: (wieder mal zu schnell... wäre wirklich von Vorteil, wenn ich besser lesen würde :wink: :roll: )
mnietz
User
Beiträge: 14
Registriert: Mittwoch 5. März 2003, 11:06
Wohnort: Berlin

Die Lösung mit

os.system("start ...)

ist perfekt und genau das was ich brauche! Nur leider läuft das so nicht unter Unix und da soll es irgendwann laufen. Wenn ich

os.system("exec ping -t www.heise.de")

benutze habe ich leider wieder das Problem das mein Python-Skript auf auf das ping wartet :(

Komm ich unter Unix nicht um ein fork() herum oder gibts auch eine Fkt. in Python die einen unabhängigen Kind-Prozess ins Leben ruft?


Vielen Dank,

Matthias
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Matthias,

schau Dir mal os.spawn* an in den verschiedenen Variationen


Gruß

Dookie
mnietz
User
Beiträge: 14
Registriert: Mittwoch 5. März 2003, 11:06
Wohnort: Berlin

Gute Idee, leider stoße ich dabei immer auf den OSError [Errno 11] resource temporarily unavailable.

Gibts auch dafür nen Tipp? Das dumme ist, dieser Fehler tritt nicht durchgehend auf. Während mein Testcode:

Code: Alles auswählen

for i in range(1,5):
   os.spawnl("NO_WAIT", "ping www.okumee.de")
   print "done"
keine Fehler produziert, läuft meine Applikation ständig in den Fehler. Welchen Fehler kann ich denn da gemacht haben?

Gruß,
Matthias.
Benutzeravatar
strogon14
User
Beiträge: 58
Registriert: Sonntag 23. Februar 2003, 19:34
Wohnort: Köln
Kontaktdaten:

mnietz hat geschrieben:Wenn ich

os.system("exec ping -t www.heise.de")

benutze habe ich leider wieder das Problem das mein Python-Skript auf auf das ping wartet :(
os.system() führt den Kindprozess in einer Subshell auf, deshalb kann man alle Funktionen der Shell benutzten, u.a. auch Job-control.

Wenn Du also:

Code: Alles auswählen

os.system('ping -c 10 www.foo.com &')
benutzt (beachte das Ampersand-Zeichen), wird ping im Hintergrund gestartet und der Pythonprompt kehrt gleich zurück. Der Ping-Prozeß überlebt auch das Ende des Python-Skripts

Funktioniert natürlich nur mit einer Unix-Shell (d.h. wahrscheinlich auch auch unter cygwin)

HTH, Chris
mnietz
User
Beiträge: 14
Registriert: Mittwoch 5. März 2003, 11:06
Wohnort: Berlin

Der Tipp mit

Code: Alles auswählen

system.out(cmd &)
dem funktioniert aber dann ist sind leider immernoch standard-in und standard-out meines "cmds" mit derselben Shell von der aus ich auch mein Python-Programm aufrufe, verbunden. Das möchte ich nicht, weil eine Reaktion auf mögliche Tastatureingaben nicht stattfinden soll.

Am liebsten wäre es mir, wenn ich für jeden Befehl den ich an das Betriebssystem absetze eine neue Shell zur Verügung stehen würde.
Gibt es einen Befehl mit dem ich in Unix eine neue Shell erzeugen kann? Dieser könnte ich ja dann die einzelnden "cmds" mit auf den Weg geben.

Danke,
mnietz
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

mnietz hat geschrieben:... aber dann ist sind leider immernoch standard-in und standard-out meines "cmds" mit derselben Shell von der aus ich auch mein Python-Programm aufrufe, verbunden....
Daß stdin, stdout und stderr mit denen des startenden Prozesses verbunden sind wirst Du nicht umgehen können, auch wenn Du eine Shell eine Shell eine Shell eine Shell (usw. ...) starten läßt. Es sei denn, Du biegst diese Files um (mit <, >, 2>).

Eine Alternative wäre tiefer einzusteigen, mit os.fork() oder pty.fork(), da hast Du viel mehr Einflußmöglichkeiten.

Viel Glück
Jörg
Antworten