python - 子进程未完成但脚本运行正确

标签 python selenium subprocess

为了运行多个计划的 python 脚本并捕获可能出现的错误,我使用一个 Controller 模块,该模块为每个脚本打开一个子进程,其中包含以下内容:

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://...

我还有其他几个 Selenium 数据抓取脚本,它们的工作方式与此脚本类似,并且到目前为止没有任何问题。 我完全迷失了这一点,可能是什么问题?

最佳答案

我在上面的代码中看到作者直接使用Popen(),然后调用“p.wait()”,其中“P”是子进程。

我在代码中使用了 subprocess.run(),但 Python 库引用文档表示 Popen 将等待该进程完成。 “p.wait()”有必要吗?

关于python - 子进程未完成但脚本运行正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54791570/

相关文章:

python - Sklearn - 数据偏向于错误

Python 采购 CSH 并将 setenv 传递给新的子进程

使用 subprocess.call 的 Python 执行顺序

java - 无法使用 Xpath 找到元素

java - Selenium 2.42.2 webdriver 是否与 Firefox 27.0.1 兼容?

python - 将 mmap 与 popen 一起使用

javascript - 在Django中,如何使选择下拉选项自动提交表单?

Python改变函数中的变量和数组?

Python:欧拉项目 Q.5

java - 使用 Selenium 的页面对象设计模式是否创建页面类并通过它们的对象调用它们的构造函数?