2017-12-16 18 views
0

Ich versuche, mehrere Funktionen nacheinander auszuführen, aber mein Code bleibt in einer Schleife stecken. Ich habe versucht, multiprocessing zu implementieren, als jemand in this thread empfohlen, aber das hat nicht geholfen.Ausführen von Funktionen in Python nacheinander

Meine Funktion sendet ein Foto an Clarifai, um eine Liste der mit diesem Foto verknüpften Schlüsselwörter zu erhalten. Danach sage ich PyAutoGUI, irgendwo auf dem Bildschirm zu klicken, wenn die Liste ein Wort enthält, das mit einer lokalen Variablen übereinstimmt. Hier ist, was eine Funktion wie folgt aussieht:

def p1_click(keyword, p1, app, model): 
    p1_response = model.predict_by_filename(filename='/Users/raulrodriguez/CODE6_OS/scripts/captcha/saucissons/p1.png') 
    p1_concepts = p1_response['outputs'][0]['data']['concepts'] 
    for concept in p1_concepts: 
     clean_list = list(map(lambda s: s.strip(), concept['name'])) 
     while any(word == inflection.singularize(keyword) for word in concept['name'].split()) == True: 
      pyautogui.click(x=490, y=385) 
      break 

if __name__=='__main__': 
    p1 = Process(target=p1_click(keyword, p1, app, model)) 
    p1.start() 

Offensichtlich, ich versuche dies für mehrere Fotos zu tun - 10 um genau zu sein - von dem vorherigen Code zu replizieren und p1 für die Nummer des Fotos zu ersetzen (dh p2_click. .. p2.start() für ein Foto mit dem Namen p2) und Ändern der Koordinatenwerte des Operators pyautogui.click. Das Problem ist jedoch, dass, wenn ich alles zusammenstelle, mein Cursor auf die Koordinaten des Fotos, für das es eine Übereinstimmung gibt, klickt und unaufhörlich klickt. Ich wollte eine Kettenreaktion haben, bei der das Programm einmal auf ein Matchfoto klickt und dann zum nächsten übergeht. Wenn jemand freundlich genug wäre, um mitzuhelfen, würde ich die Hilfe wirklich schätzen.

Antwort

1

Das Problem Sie stehen, ist in diesem Code:

if __name__=='__main__': 
    p1 = Process(target=p1_click(keyword, p1, app, model)) 
    p1.start() 

Insbesondere diese Linie p1 = Process(target=p1_click(keyword, p1, app, model)). Genauer gesagt target=p1_click(keyword, p1, app, model). Wenn Sie dies tun, wird die Funktion p1_click aufgerufen, sobald Sie sie target zuweisen.

Dies ist nicht, wie Sie eine Methode durch multiprocessing Modul aufrufen und Argumente übergeben. Um Parameter in Multiprocessing-Modul übergeben Sie dies tun:

p1 = Process(target=p1_click, args=(keyword, p1, app, model)) 

Sie können weitere Informationen über Multiprozessing bekommen und wie es zu benutzen in this SO answer

+0

Vielen Dank für Ihre Antwort! Ich habe den für die anderen Fotos vorgeschlagenen Code geändert und folgende Fehlermeldung erhalten: 'objc [3396]: + [NSEvent initialize] wurde möglicherweise in einem anderen Thread ausgeführt, als fork() aufgerufen wurde. Wir können es nicht sicher aufrufen oder im fork() child-Prozess ignorieren. Absturz stattdessen. Setzen Sie einen Breakpoint auf objc_initializeAfterForkError auf debug. "Muss ich' p1.start() '' entfernen? – solo

+0

@rrod Dies scheint wie ein Plattformproblem oder etwas ähnliches zu sein. Es ist nicht mit Python verwandt. Eine schnelle [Google-Suche] (https://www.google.co.in/search?q=objc%5B3396%5D%3A+%2B%5BNSEvent+initialisieren%5D+könnte+haben+in+progress+in + ein anderes + thread + wenn + fork() + wurde + aufgerufen & oq = objc% 5B3396% 5D% 3A +% 2B% 5BNSEvent + initialisieren% 5D + kann + haben + war + + Fortschritt + + ein + Thread + wenn + fork() + wurde + genannt & aqs = chrome..69i57.391j0j7 & sourceid = chrome & ie = UTF-8) könnte hilfreich sein. Wenn dies nicht hilft, können Sie eine andere Frage stellen. Diese Antwort löst Ihr ursprüngliches Problem, Funktionen parallel aufzurufen. –

Verwandte Themen