subprocess Problem

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
Floqqi

Hallo liebe Community,

erstmal sorry falls ich das falsche Subforum gewählt hab, aber ich bin neu hier.
Ich bin auch noch relativ frisch in der Pythonprogrammierung.
Derzeit bin ich an einem kleinen Tool, mit welchem man eine csv-Datei einlesen kann, wo dann automatisch die Spalte mit den IP-Addressen auswählt, anpingt und wieder ein csv-File mit zusätzlicher Spalte (Erreichbarkeit) erzeugt. Das Progrämmchen hat eine grafische Oberfläche (wxPython), alles funktioniert auch soweit. Was mich aber stört, wenn ich ein ping-Befehl gesendet wird plobt jedes mal eine neue Konsole in den Vordergrund auf. Das stört 1. beim arbeiten und 2. ist es weniger schön. Die Befehle in einem Konsolenfenster ablaufen zu lassen ist nicht möglich aufgrund der for-Schleife. (Ginge das überhaupt? :P) Wäre es möglich die Konsole ganz zu "verstecken"?
Sollte auf einem 64bit System (Win7 + WinXP) funktionieren.
Pythonversion ist 2.7.1 (64bit - AMD64)!

Code: Alles auswählen

import os

IP = "google.de"
command = "ping %s" % IP
print os.system(command)
Alles halt in einer for-Schleife, wo es mehrere IP's durchläuft!

Mit dem subprocess-Modul hab ich es auch schon ausprobiert, allerdings weiß ich nicht wirklich ob was passiert (wird nichts angezeigt) und wie ich es auswerten kann, da ich keine Rückgabe bekomme.

Code: Alles auswählen

import os, subprocess
from subprocess import Popen

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen("ping google.de", startupinfo=startupinfo)
Zuletzt geändert von Floqqi am Dienstag 18. Januar 2011, 14:52, insgesamt 2-mal geändert.
BlackJack

@Floqqi: `Popen` startet das Programm asynchron. Die `wait()`-Methode wartet auf das Ende des Prozesses und gibt auch den Rückgabewert zurück. Wie man `os.system()` mit `subprocess` ersetzt, steht aber auch in dem Abschnitt mit Beispielen in der `subprocess`-Dokumentation.
Floqqi

Ah, vielen Dank :)
Ich habs anscheinend überlesen...

Der Code funktioniert einwandfrei mit meinem Python 2.7.1 :)

Code: Alles auswählen

import subprocess

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen("ping 192.168.0.1", startupinfo=startupinfo)
print subprocess.Popen.wait(proc)
Floqqi

Nun hätte ich noch eine Frage:
Wie kann ich mit dem subprocess.Popen(...) mehrer Pings parallel ausführen? Ich komm nicht dahinter...
Wenn ich die IPs mit einem "&" - wie es in Windows vorgesehen ist - verbinde, bekomme ich nur ein Ergebnis von Popen.wait() zurück, also eins für beide IPs.
Das ist aber nicht mein gewünschtes Ziel, da wenn eine der beiden IPs nicht erreichbar ist, ich nur eine 1 statt eine 1 und eine 0 zurück bekomme.


Mit freundlichen Grüßen
BlackJack

@Floqqi: Einfach starten, die laufen dann schon parallel. Der blockierende Methodenaufruf ist ja das `wait()`. Diese Aufrufe darfst Du dann erst machen wenn Du alle Pings gestartet hast.
Floqqi

BlackJack hat geschrieben:@Floqqi: Einfach starten, die laufen dann schon parallel. Der blockierende Methodenaufruf ist ja das `wait()`. Diese Aufrufe darfst Du dann erst machen wenn Du alle Pings gestartet hast.
Die Liste der IPs lass ich mit einer for-Schleife durchlaufen, welche auch solange wartet, bis die Antwort da ist ("wait()" direkt in der Schleife). Ich könnte ja die Liste in Blöcke mit z. B. 10 IPs unterteilen. Gibt es eine Grenze wieviele Prozesse da laufen dürfen? Bei einer Liste mit ~300 IPs wäre es ja nicht wirklich schlau alle parallel laufen zu lassen.
Welche Größe für die Liste sollte ich max. ansetzen und welche Größe geht max. (mit Größe ist die Anzahl der IPs gemeint)?
Antworten