Probleme mit doppeltem Raw Input/multiprocessing

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
Aemilia
User
Beiträge: 3
Registriert: Sonntag 9. Dezember 2012, 12:49

ich wusste nicht ganz wo das hingehört (bin auch neu), daher hier:

In meiner main steht in etwa das folgende:

Code: Alles auswählen

 status = raw_input("Möchten sie Host sein? (J/N) ") 
    if status=="j":
        print("host")
        serverprozess = Process(target= spawn_server)
        serverprozess.start()
    clientprozess = Process (target = spawn_client)
    clientprozess.start()
Die hier aufgerufenen Methoden sehen so aus:

Code: Alles auswählen

def spawn_server():
    mserver = server.Gameserver()
    #a process for the host. spawned if and only if the player acts as host
    
def spawn_client():
    myClient = client.Client()
    #and a process for the client. this is spawned regardless of the player's status
    
            

Das funktionierte bis gestern auch einwandfrei.

Nur habe ich nun in den Konstruktor vom Client noch folgende Zeile eingefügt:

Code: Alles auswählen

ip = raw-input("Bitte Ip eingeben")

Und seitdem fliegen da Fehler. Jeder der beiden raw-inputs funktioniert einzeln an der Stelle wo er sitzt gut, aber wenn ich beide drinnen lasse, kommt folgende Fehlermeldung:

Code: Alles auswählen

    ret = original_raw_input(prompt)
EOFError: EOF when reading a line

Kann man das Fixen? Bzw., Ist es nicht möglich, 2 voneinander unabhängige raw-Inputs im selben Programm zu haben?
Aemilia
User
Beiträge: 3
Registriert: Sonntag 9. Dezember 2012, 12:49

Hm.
Ich habe das Problem umgangen indem ich den zweiten raw-input einfach auch in die Main gepackt habe.

Nun dachte ich immer, dass Raw-Input letzten Endes einen String zurück gibt.

Scheinbar lag ich da aber falsch denn nun sieht das ganze so aus:

Code: Alles auswählen

ip = raw_input("IP-Adresse: ")
    print (ip)
    clientprozess = Process (target = spawn_client, args = ip)
    clientprozess.start()
Soweit funktioniert das, allerdings kommt nun die Meldung, ich spawn_client 9(!) Argumente übergeben anstelle des einen, dass er braucht.


Da ich mit LOCALHOST gearbeitet habe, würde das Stimmen, wenn er jedes Zeichen aus 127.0.0.1 als ein Argument wertet - aber ip ist doch nur EINE Variable?

Wo sitze ich auf meinem Hirn?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

args muss ein iterable sein und jedes Element dieses iterables wird als Argument an die in target gebundene Funktion gegeben. Du hast mit deiner Vermutung, dass der String in neun Teile geteilt wird, also recht. Die Lösung ist also ganz einfach: packe den String in ein einelementiges Tupel:

Code: Alles auswählen

clientprozess = Process (target = spawn_client, args = (ip,))
Und bitte gewöhne dir an Code hier her zu kopieren und nicht abzuschreiben. Damit baust du nur zusätzliche Fehler ein. Auch solltest du die Fehlermeldungen, inklusive des gesamten Tracebacks, hier posten. Nicht nur den Teil, den du für relevant hältst. Im Traceback stecken viele zusätzliche Informationen, welche dir jetzt vielleicht noch nichts sagen, den Helfenden aber schon.

Bis dann,
Sebastian
Das Leben ist wie ein Tennisball.
Aemilia
User
Beiträge: 3
Registriert: Sonntag 9. Dezember 2012, 12:49

Ist ok......mache ich mit dem Traceback demnächst so.

Allerdings HABE ich den Code kopiert und nicht abgeschrieben, wo sieht das denn aus als hätte ich abgeschrieben?
:K

Danke für die Antwort. :mrgreen:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Aemilia hat geschrieben:In meiner main steht in etwa das folgende:
Deutet für mich auf abgeschrieben/beliebig gekürzt hin.

Und die Zeile
Aemilia hat geschrieben:

Code: Alles auswählen

ip = raw-input("Bitte Ip eingeben")
macht ebenfalls den Eindruck. Mit "raw_input" sollte es auch keinen Fehler mehr geben. Warum das so ist, solltest du dir mal selber überlegen. Vielleicht ein Hinweis: input versucht den übergebenen String auszuführen.

Edit: Vielleicht noch eine kleine Ergänzung: das Forum unterstützt Python-Codetags, dann ist das Syntaxhighlighting noch besser.
Das Leben ist wie ein Tennisball.
Antworten