Подпроцесс не завершается, но скрипт выполняется правильно - PullRequest
0 голосов
/ 20 февраля 2019

Для запуска нескольких запланированных сценариев Python и выявления ошибок, которые могут возникнуть, я использую модуль контроллера, который открывает подпроцесс для каждого сценария со следующими параметрами:

def _process_script(nm_script, return_val):
    try:
        env = os.environ
        p = subprocess.Popen(['python', nm_script], stdout = subprocess.PIPE,
           shell=False, env=env, stderr=subprocess.PIPE)
        p.wait()
        (result, error) = p.communicate()

        if p.returncode != 0:
            cd_exec = -1
            tx_exec = error.decode('utf-8')
        else:
            cd_exec = 1
            tx_exec = None

    except subprocess.CalledProcessError as e:
        cd_exec = -1
        tx_exec = e.output

    return_val += [cd_exec, tx_exec]


def run_script(script):
    return_val = multiprocessing.Manager().list()

    #20 min timeout for the script
    maxDelay = 1200
    p = multiprocessing.Process(target=_process_script, args=(script.nm_script, return_val))
    p.start()
    p.join(maxDelay)

    #Checks if the process is still alive
    if p.is_alive:
        p.terminate()
        p.join()
        cd_exec = -1
        tx_exec = 'Timeout'
    else:
        cd_exec = return_val[0]
        tx_exec = return_val[1]

    return return_val

Код выше сработалдля всех сценариев до сих пор.Тем не менее, существует один сценарий обработки данных Selenium, который, кажется, зависает после его выполнения, и я не могу найти проблему.Вот и все:

from selenium import webdriver

def main():
    path = r'\\path'
    browser = webdriver.Chrome()
    url = '...'
    browser.get(url)

    #...Several steps that do the necessary scraping and export data to the path

    #I have added the following steps to kill the browser instance:
    browser.get('about:blank')
    browser.find_element_by_tag_name('body').send_keys(Keys.ESCAPE)
    time.sleep(2)
    browser.quit()
    del browser

    return

Процесс выполняется успешно.Данные экспортируются должным образом, и открытый экземпляр браузера закрывается.Однако основной сценарий продолжает отображать сообщение, касающееся DevTools, до истечения времени ожидания 20 минут:

DevTools listening on ws://...

У меня есть несколько других сценариев очистки данных селена, которые работают аналогично этому, и без каких-либобеда пока.Я полностью потерян на этом, в чем может быть проблема?

1 Ответ

0 голосов
/ 25 февраля 2019

Я вижу, что в приведенном выше коде автор использует Popen () напрямую, а затем вызывает "p.wait ()", где "P" - это подпроцесс.

Я использую subprocess.run () в моем коде, но в справочной документации библиотеки Python говорится, что Popen будет ждать завершения процесса.Требуется ли p.wait ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...