【问题标题】:Eclipse / PyDev Stop button not working with OSError: [WinError 6] The handle is invalid errorEclipse/PyDev 停止按钮不适用于 OSError:[WinError 6] 句柄无效错误
【发布时间】:2021-03-18 21:53:04
【问题描述】:

我在 Windows 10 上有以下 Eclipse 版本:

Version: 2020-09 (4.17.0)
Build id: 20200910-1200

我正在使用 PyDev。

在我的代码中,我使用 selenium 来进行一些 url 调用(网络抓取)。当某个特定的 url 不存在或至少不以我正在阅读的大多数 url 的方式存在时,我会收到以下错误:

  Traceback (most recent call last):
  File "C:\Users\foobar\eclipse-workspace\WeatherUndergroundUnderground\historical\BWI_Fetch.py", line 44, in <module>
    main(city, month_date, start_year, end_year)
  File "C:\Users\foobar\eclipse-workspace\WeatherUndergroundUnderground\historical\BWI_Fetch.py", line 22, in main
    driver.get(city_url);
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get
    self.execute(Command.GET, {'url': url})
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Reached error page: about:neterror
Exception ignored in: <function Popen.__del__ at 0x0000019267429F70>
Traceback (most recent call last):
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 945, in __del__
    self._internal_poll(_deadstate=_maxsize)
  File "C:\Users\foobar\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1344, in _internal_poll
    if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
OSError: [WinError 6] The handle is invalid

当我收到此特定错误时,eclipse 仍在运行,并且按下红色停止按钮无法结束程序。我通常可以对我编写的任何其他 python 程序使用红色停止按钮,但这个代码/错误似乎挂起。如何从 Eclipse 应用程序中结束进程?

【问题讨论】:

    标签: eclipse selenium selenium-webdriver windows-10 pydev


    【解决方案1】:

    堆栈跟踪中的错误与 PyDev 并不真正相关,因此,堆栈跟踪错误只能在 Selenium/Python 中真正修复(错误表示它正在尝试访问在 __del__ 上已经死的进程)。

    现在,与 PyDev 无法杀死它的原因有关,我认为您可能有一些进程产生了一个子进程并且由于父进程死亡而不再可访问,因此无法创建树从 PyDev 中启动的初始进程中终止该进程。

    在 PyDev 中执行此操作的实际代码是:https://github.com/fabioz/winp/blob/master/native/winp.cpp#L208

    我认为应该可以使用 windows api 创建一个 JobObject 然后 AssignProcessToJobObject 并且在 kill 时也会杀死 JobObject 以便它杀死所有关联的进程,以便以这样的方式进行设置发生,但目前尚未完成。

    作为说明,通常我有一个别名:taskkill /im python.exe /f(这将杀死机器中运行的所有 python.exe 进程),这是我通常在这种情况下使用的,所以,如果发生类似的事情,我只需杀死机器中的所有 python.exe 进程即可。

    尽管请注意,如果您生成了一些其他进程...例如,chrome.exe -- 在该进程树中,该进程也必须被终止,以便真正释放启动 python 的初始 shell。

    【讨论】:

      【解决方案2】:

      此错误消息...

      Exception ignored in: <function Popen.__del__ at 0x0000019267429F70>
      

      ...暗示内置模块在垃圾收集过程中运行__del__之前已被销毁。

      因此PyDev 不再能够与相关的python 模块进行通信。结果 Stop 按钮不起作用并引发错误:

      OSError: [WinError 6] The handle is invalid
      

      【讨论】:

      • 如果我进入 Process Explorer 并杀死相关的 python 任务,Eclipse 似乎仍然会忘记这一点。那么是否需要在某处提出功能请求,也许是 PyDev 问题?
      • @demongolem 检查这个Python issue
      猜你喜欢
      • 2021-11-24
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 2017-02-27
      相关资源
      最近更新 更多