关于#python#打包成.exe后SSL握手失败报错的问题,如何解决?

在python的开发环境中正常运行,打包成.exe之后,报错SSL握手失败,代码大概是使用浏览器点击固定网页上的内容,代码可以正常运行,使用pyinstaller --onefile --hidden-import=selenium --add-data "msedgedriver.exe;." -i XXX.py命令打包的,报错情况如下

img


[9816:8180:0703/083421.230:ERROR:ssl_client_socket_impl.cc(1157)] handshake failed; returned -1, SSL error code 1, net_error -101

根据你提供的报错信息,SSL握手失败的问题可能与打包的可执行文件无法正确加载所需的SSL证书或库有关。

下面是一些可能的解决方案:

  1. 指定SSL证书路径:在创建浏览器实例时,尝试指定 SSL 证书的路径。例如,如果你使用的是Selenium Webdriver和Chrome浏览器,可以通过以下方式设置证书路径:

    from selenium import webdriver
    options = webdriver.ChromeOptions()
    options.add_argument("--ssl-client-certificate=path/to/your/certificate.pem")
    driver = webdriver.Chrome(executable_path="path/to/chromedriver", chrome_options=options)
    

    将"path/to/your/certificate.pem"替换为实际的证书路径。

  2. 导入缺失的SSL库:考虑是否缺少某些必要的SSL库。你可以尝试在代码中显式导入SSL相关的库,以确保它们被正确加载。例如:

    import _ssl
    import _socket
    import httplib
    

    这将尝试显式导入_ssl_sockethttplib库。

  3. 检查pyinstaller打包的相关选项:确保没有遗漏任何必要的依赖项或文件。你可以尝试添加其他的hidden-imports,例如--hidden-import=ssl,以确保SSL模块得到正确加载。

  4. 尝试其他浏览器驱动程序:如果你使用的是Chrome浏览器驱动程序(如Chromedriver),可以尝试使用其他浏览器驱动程序,如Geckodriver(适用于Firefox)或Edgedriver(适用于Edge/Chromium浏览器),以查看是否有所改善。

请尝试以上方法,并根据你的实际情况进行调整。如果问题仍然存在,建议检查代码的其他部分,例如SSL证书的有效性、网络连接等,以进一步排查问题。