ImportError使用Anaconda Python在Windows 10 Git Bash上导入_ssl

时间:2019-02-12 01:43:29

标签: python windows ssl anaconda

上下文

我正在为具有自签名证书的公司代理提供支持。我已经对此进行了广泛的记录。

现在的问题是TLS / SSL模块无法正确加载,甚至无法验证证书。

  • Windows 10
  • Anaconda 2018.12(Python 3.7.1)
  • git版本2.19.0.windows.1

问题

python -c "import ssl"
  

我可以在Anaconda Prompt中使用它,但不能在Git Bash中使用它。为什么有区别?

步骤

使用Git Bash

我首先进行了最新版本(在撰写本文时)Anaconda发行版2018.12的基本安装,然后尝试安装redis

$ pip install redis
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting redis
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/redis/
  ...
  Could not fetch URL https://pypi.org/simple/redis/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/redis/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
  Could not find a version that satisfies the requirement redis (from versions: )
No matching distribution found for redis

这很奇怪。 SSLError("Can't connect to HTTPS URL because the SSL module is not available.")。因此,我尝试仅导入ssl

$ python -c "import ssl"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\ssl.py", line 98, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: DLL load failed: The specified procedure could not be found.

Anaconda提示

(base) C:\Users\username> python -c "import ssl"

(base) C:\Users\username> 

没有错误。只是一个空行。

(base) C:\Users\username> conda deactivate
C:\Users\username>
C:\Users\username> python -c "import ssl"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\ssl.py", line 98, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: DLL load failed: The specified procedure could not be found.

停用基本conda环境后,我可以在Anaconda Prompt中复制错误。

摘要

显然,_ssl.pyd中的C:\Users\username\AppData\Local\Continuum\anaconda3\DLLs文件确实可以工作,但是我缺少某些东西,或者不知道如何进一步调试以弄清楚为什么它在Git Bash中不起作用。

我不了解如何调试python如何加载DLL以及Anaconda环境如何对此产生影响。

2 个答案:

答案 0 :(得分:0)

由于git bash似乎与众不同,因此我尝试将其从2.19.0更新为2.20.1,现在它可以在Git Bash中使用。

这很奇怪,因为两个版本都配置为使用Windows安全通道后端进行TLS / SSL。

[http]
    sslBackend=schannel

更新:Git V2.20.0发行说明

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.20.0.txt

  

自v2.19起更新

     

用户界面,工作流程和功能

     
      
  • 在具有最新cURL库,http.ssl后端配置的平台上   变量可用于在运行时选择其他SSL后端。   Windows端口使用此机制在OpenSSL和   通过HTTPS协议进行通话时确保安全通道。
  •   
     

性能,内部实施,开发支持等

     
      
  • 改进了Windows端口上DLL的加载方式。
  •   

这些似乎是Git Bash中唯一可能引起此问题的更改。我以为它使用的是Windows Secure Channel,但也许以前使用的是Git Bash OpenSSL并将其更新指向schannel

或者,如何将msys终端仿真器加载到DLL中。

答案 1 :(得分:-1)

也许这会有所帮助。来自public interface UserEventRepository extends JpaRepository<UserEvent, Long> { List<UserEvent> findAllByUserId(Long userId); @Query(value = "SELECT user_id FROM user_event ue " + "WHERE ue.user_id = :userId", nativeQuery = true) List<Long> findUserIdByEventId(@Param("userId") Long userId); }

的提示