Python 子进程未完成,但脚本运行正确
为了运行多个计划的python脚本并捕获可能出现的错误,我使用了一个控制器模块,该模块为每个脚本打开一个子流程,其中包含以下内容:Python 子进程未完成,但脚本运行正确,python,selenium,subprocess,Python,Selenium,Subprocess,为了运行多个计划的python脚本并捕获可能出现的错误,我使用了一个控制器模块,该模块为每个脚本打开一个子流程,其中包含以下内容: def _process_script(nm_script, return_val): try: env = os.environ p = subprocess.Popen(['python', nm_script], stdout = subprocess.PIPE, shell=False, env=
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
到目前为止,上述代码适用于所有脚本。然而,有一个脚本在执行后挂起,我似乎找不到问题。就是这样:
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()”必要吗?我在上面的代码中看到,作者直接使用Popen(),然后调用“p.wait()”,其中“p”是子进程 我在代码中使用subprocess.run(),但是Python库参考文档说Popen将等待进程完成。是否需要“p.wait()”