Mit subprocess pythonprogramm aufrufen

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
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

hallo forum
ich habe ubuntu und möchte ein chatprogramm schreiben.
momentan besteht dieses chat allerdings noch aus einem server programm und einem client programm.
hier erstmal der server

Code: Alles auswählen

import socket,time

s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
    s.bind(("", 50000))
    print "Der Server hat gestartet"
    while True: 
        daten, addr = s.recvfrom(999999999) 
        print "[%s] %s" % (addr[0], daten)
finally: 
    s.close()
und hier der client

Code: Alles auswählen

import socket

s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ip= raw_input("IP Adresse: ")
nachricht=''
while nachricht != '/close/':
    nachricht = raw_input("Nachricht: ")

    s.sendto(nachricht,(ip,50000))
    print "Die Nachricht wurde gesendet"
s.close()
print "Die Verbindung wurde geschlossen"
nun habe ich vor diese beide programme in eins zu vereinen oder zumindest in einem terminal zu öffnen.
ich habe mich erkundigt und erfahren dass man mit subprocess programme parallel aufrufen kann.
nur wie geht das?
ich habe schon

Code: Alles auswählen

p= subprocess.Popen(["python","/home/pfad/server.py","-q"], stdout=subprocess.PIPE)
versucht
aber wenn ich dann den clienten in einem anderen terminal öffne, passiert in dem serverterminal nichts.

wie kann das serverprogramm und das clientprogramm zusammenführen, ohne gui oberfläche?

schonmal danke
campino97

sorry dass es so lang ist, ich wollte aber so viele informationen wie möglich schreiben.
needsch
User
Beiträge: 15
Registriert: Donnerstag 22. Dezember 2011, 21:28

Hallo campino,

du musst das stdout=PIPE weglassen:

Code: Alles auswählen

p = subprocess.Popen(["python","/home/pfad/server.py","-q"])
Erklärung:
Wenn stdout=PIPE angegeben wird, dann wird eine Verbindung zu dem stdout-Stream des Kind-Prozesses geöffnet. Die Ausgabe des Kindes kann somit vom Eltern-Prozess gelesen werden ohne dass sie dabei auf der Konsole erscheint.

Wenn man stdout weglässt wird einfach der aktuelle stdout-Stream vom Eltern-Prozess geerbt. In den meisten Fällen heißt das, dass der Kind-Prozess in die Konsole schreiben wird. (Es kommt eher selten vor, dass der stdout-Stream eines Programms auf etwas anderes als die Konsole umgeleitet wird.)

Tipp: Du kannst deinen Code noch etwas schöner formatieren, z.B. einheitlich Leerzeichen vor und nach = einfügen etc. Beispiel: x = 5 statt x= 5 oder x =5. Optimal wäre es natürlich, wenn du dir mal PEP 8 ansehen würdest. :-) Aber das wichtigste ist wirklich, dass es einheitlich ist.

Viele Grüße
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

danke needsch
dein eintrag hat mir sehr geholfen das programm funktioniert jetzt genau so wie ich es wollte.
Ich werde mir auch PEP 8 mal durchlesen.
vielen dank
Antworten