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
Kindprozesse erzeugen
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.
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.
Wenn Du unter Windows bleiben willst, und auf Plattformübergreifende Lösungen verzichten kannst:
Der Prozess start ist fertig, sobald das Programm läuft, also arbeitet Python dann da weiter.
Code: Alles auswählen
os.system('start DeinProgramm')
mfg,
10011110
10011110
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).ASCII158 hat geschrieben:Wenn Du unter Windows bleiben willst, und auf Plattformübergreifende Lösungen verzichten kannst:
Der Prozess start ist fertig, sobald das Programm läuft, also arbeitet Python dann da weiter.Code: Alles auswählen
os.system('start DeinProgramm')
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.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.
Jörg
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
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
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:
keine Fehler produziert, läuft meine Applikation ständig in den Fehler. Welchen Fehler kann ich denn da gemacht haben?
Gruß,
Matthias.
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"
Gruß,
Matthias.
- strogon14
- User
- Beiträge: 58
- Registriert: Sonntag 23. Februar 2003, 19:34
- Wohnort: Köln
- Kontaktdaten:
os.system() führt den Kindprozess in einer Subshell auf, deshalb kann man alle Funktionen der Shell benutzten, u.a. auch Job-control.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![]()
Wenn Du also:
Code: Alles auswählen
os.system('ping -c 10 www.foo.com &')
Funktioniert natürlich nur mit einer Unix-Shell (d.h. wahrscheinlich auch auch unter cygwin)
HTH, Chris
Der Tipp mit
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
Code: Alles auswählen
system.out(cmd &)
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
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>).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....
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