【问题标题】:python error:ImportError: sys.meta_path is None, Python is likely shutting downpython 错误:ImportError: sys.meta_path is None,Python 可能正在关闭
【发布时间】:2016-12-18 09:12:05
【问题描述】:

我在pycharm中写了一个python程序,包括FBCrawl.py,html_login.py,common/glovar.py,在glovar.py中,我定义了一个变量webdriver_browser,想在FBCrawl.py和html_login.py中使用这个webdriver_browser ,主要目的是登录facebook获取页面内容,使用selenium,程序如下,但运行时, 错误:

C:\Python\Python36\python.exe           C:/Python/PyCharmProject/FaceBookCrawl/FBCrawl.py
None
Exception ignored in: <bound method Service.__del__ of <selenium.webdriver.chrome.service.Service object at 0x00000146BF1FD438>>
Traceback (most recent call last):
  File "C:\Python\Python36\lib\site-packages\selenium\webdriver\common\service.py", line 173, in __del__
  File "C:\Python\Python36\lib\site-packages\selenium\webdriver\common\service.py", line 149, in stop
  File "C:\Python\Python36\lib\site-packages\selenium\webdriver\common\service.py", line 120, in send_remote_shutdown_command
 ImportError: sys.meta_path is None, Python is likely shutting down

 Process finished with exit code 0

程序在这里:

FBCrwal.py:

from common import glovar
from html_login import HtmlLogin
from selenium import webdriver

if __name__ == '__main__':

    baseurl = "http://www.google.com"
    #log in the website
    login_url = "https://www.facebook.com/login.php?login_attempt=1&lwv=110"
    HtmlLogin().login(login_url)
    html_cont = glovar.webdriver_browser.get("https://www.facebook.com/alexis.n.griffith.3")
    print(html_cont)

html_login.py:

from selenium import webdriver

from common import glovar


class HtmlLogin(object):

    def login(self,url):
        if url is None:
            return
        login_url = url
        glovar.webdriver_browser = webdriver.Chrome()
        glovar.webdriver_browser.get(login_url)
        #user credentials
        user =  glovar.webdriver_browser.find_element_by_css_selector("#email")
        user.send_keys('********@gmail.com')
        password = glovar.webdriver_browser.find_element_by_css_selector("#pass")
        password.send_keys('********')
        login = glovar.webdriver_browser.find_element_by_css_selector("#loginbutton")
        login.click()

glovar.py:

webdriver_browser =  None

请告诉我原因和解决方法

【问题讨论】:

  • 为什么执行“print(html_cont)”,输出为“None”

标签: python selenium


【解决方案1】:

如果您仍在寻找答案:尝试使用

结束您的脚本
glovar.webdriver_browser.quit()

我遇到了同样的错误,只需添加此行即可解决。希望对您有所帮助

【讨论】:

    【解决方案2】:

    如果您使用多线程来运行后台任务并且主程序线程完成,则可能会出现错误。此时 Python 解释器将开始被销毁,但如果守护线程中的后台任务仍在运行并且在 C 代码中运行,它仍然可以运行。

    这会导致问题,因为解释器是被销毁的一部分。这种情况的一个症状就是你所看到的,因为在销毁解释器时,模块中的任何对象查找都开始返回None,因为模块的内容已被清除。正在检测到这一点,您会收到该错误。

    如何解决这种情况实际上取决于代码在做什么。一种方法可能是识别后台任务并等待它完成,可能使用某种方式来表示线程应该停止,否则它会无限期地运行。

    深入研究 selenium 代码的另一个原因可能是一个更好的解释,即 __del__() 方法被添加到对象中以完成工作,并且在解释器关闭时对象被销毁时调用这些方法。如果您跟踪 selenium 代码,它们来自 __del__() 方法中执行模块的延迟导入。因为__del__()是在解释器被销毁的时候被调用的,所以模块已经被解释为被清除并且失败了。

    如果是这种情况,你唯一能做的就是在退出程序之前从你的代码中显式地停止 selenium 驱动程序。这样你就可以在解释器被破坏之前完成它。

    这是一个你真的应该问 selenium 人的问题,或者查看文档,看看你是否错误地使用了 API。也就是说,像 selenium 代码那样在 __del__() 方法中做一些事情是不好的做法。只要他们继续这样做,可能很难阻止它,除非您只是错误地使用了他们的 API。

    【讨论】:

    • 但是在这个程序中,我没有使用多线程,请您直接修改程序
    最近更新 更多