Выполнение функций в Python последовательно

Я пытаюсь заставить несколько функций запускаться одна за другой, но мой код постоянно зацикливается. Я пытался реализовать multiprocessing, как рекомендовал кто-то в этой ветке, но это не помогло. т помочь.

Моя функция отправляет фотографию в Clarifai, чтобы получить список ключевых слов, связанных с указанной фотографией, после чего я говорю PyAutoGUI щелкнуть где-нибудь на экране, если указанный список содержит слово, совпадающее с локальной переменной. Вот как выглядит одна функция:

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()

Очевидно, я пытаюсь сделать это для нескольких фотографий — 10, если быть точным — путем повторения предыдущего кода и замены p1 на номер фотографии (т. е. p2_click ... p2.start() для фотографии с именем p2) и изменения координаты значения оператора pyautogui.click. Проблема, однако, в том, что, когда я собираю все вместе, мой курсор перемещается на координаты pyautogui.click фотографии, для которой есть совпадение, и непрерывно щелкает. Я хотел получить цепную реакцию, при которой программа один раз нажимает на фотографию матча, а затем переходит к следующей. Если кто-то будет достаточно любезен, чтобы перезвонить, я был бы очень признателен за помощь.


person solo    schedule 16.12.2017    source источник


Ответы (1)


Проблема, с которой вы столкнулись, заключается в этом коде:

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

В частности, эта строка p1 = Process(target=p1_click(keyword, p1, app, model)). Еще точнее target=p1_click(keyword, p1, app, model). Когда вы делаете это, функция p1_click вызывается, как только вы назначаете ее target.

Это не то, как вы вызываете метод через модуль multiprocessing и передаете аргументы. Чтобы передать параметры в многопроцессорный модуль, вы делаете это:

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

Вы можете получить больше информации о многопроцессорности и о том, как ее использовать, в этом ответе SO

person Amit Tripathi    schedule 16.12.2017
comment
Спасибо за ваш ответ! Я изменил предложенный вами код для других фотографий и получил следующее сообщение об ошибке: objc[3396]: +[NSEvent initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug. Нужно ли удалять p1.start()? - person solo; 17.12.2017
comment
@rrod Это похоже на проблему с платформой или что-то в этом роде. Это не связано с Питоном. Быстрый поиск Google может быть полезен. Если это не поможет, вы можете задать другой вопрос. Этот ответ решает вашу первоначальную проблему параллельного вызова функций. - person Amit Tripathi; 17.12.2017