Python 由于缺少hmac.compare_time函数,因此出现令人讨厌的加密预处理警告

Python 由于缺少hmac.compare_time函数,因此出现令人讨厌的加密预处理警告,python,python-requests,urllib,urllib3,Python,Python Requests,Urllib,Urllib3,事情一直进展顺利,直到我的一个项目开始在每一次执行的顶部,在每一个地方至少打印一次: local/lib/python2.7/site-packages/cryptography/hazmat/primitives/constant_time.py:26: CryptographyDeprecationWarning: Support for your Python version is deprecated. The next version of cryptography will remo

事情一直进展顺利,直到我的一个项目开始在每一次执行的顶部,在每一个地方至少打印一次:

local/lib/python2.7/site-packages/cryptography/hazmat/primitives/constant_time.py:26: CryptographyDeprecationWarning: Support for your Python version is deprecated. The next version of cryptography will remove support. Please upgrade to a 2.7.x release that supports hmac.compare_digest as soon as possible.
我不知道它为什么会启动,并且会中断应用程序/工具的输出,特别是当它被其他工具捕获和使用时。就像很多困难一样,我相当确定它与
urllib
以及相关的
请求相关。更糟糕的是,我有太多的项目和交叉依赖项,以至于我不可能通过调用
warnings.filterwarnings()
来更新所有导入和分支以抑制警告

我有Python 2.7.6。显然这在2.7.7中消失了。只是,我有一些2.7.6版本的系统没有看到警告。所以,在一个版本中可能会或可能不会禁用它们,我可能无意中用另一个版本替换了它

我的Ubuntu、Python、urllib、请求(带有安全选项)、加密和hmac都是在打印警告的系统和不打印警告的系统上的相同版本/构建


在线上似乎没有相关的警告或公告,到目前为止,似乎任何相关的项目都是静态/稳定的(即使“hmac”可以通过PIP安装,但它已经八年没有改变)。

我开始通过一个简单的
请求获得此警告。get
调用。此警告在加载模块
cryptography.hazmat.primitives.constant_time
时打印,因此每个Python程序通常只会出现一次。如果您多次看到它,那一定是因为Python程序(如实用程序)执行了多次。您只需识别该程序并将以下代码添加到主入口点:

import cryptography
from cryptography import utils
with warnings.catch_warnings():
    warnings.simplefilter('ignore', cryptography.utils.DeprecatedIn23)
    import cryptography.hazmat.primitives.constant_time

我犯了这个错误很久了。对于我的环境来说,将Python升级到比2.7.6更高的版本是一件痛苦的事情。更简单的解决方案是使用pip降级加密模块:

pip2.7 install cryptography==2.2.2
我认为最好的解决方案是升级您的python版本,尽管这个答案适用于Python3

我是在使用Paramiko时找到答案的。对于那些仍在寻找简单答案的人。在导入Paramiko之前,我用这些代码行获得了这些密码:

import warnings 
warnings.filterwarnings(action='ignore',module='.*paramiko.*')

我希望这有助于

当您安装pip2.7加密==2.2.2时,似乎仍然会出现错误。 我相信您还需要
sudopip2.7安装--升级pip
Aso,自19年5月5日起,最新的密码似乎仅适用于Python3:

显然,这对我起了作用,解决了我遇到的类似问题/症状:

pip3安装——升级paramiko

这在我的系统上安装了paramiko 2.6.0,取代了2.4.2:

$ pip3 install --upgrade paramiko
[...]
Installing collected packages: paramiko
  Found existing installation: paramiko 2.4.2
    Uninstalling paramiko-2.4.2:
      Successfully uninstalled paramiko-2.4.2
Successfully installed paramiko-2.6.0
$

,因此我无法在Python2上测试这一点。

如果您想更选择性地仅抑制特定的弃用警告:

import warnings
from cryptography.utils import CryptographyDeprecationWarning
warnings.filterwarnings("ignore", category=CryptographyDeprecationWarning)

我通过从Python源代码
[您的安装路径]\Python\Lib\site packages\cryptography\\uuuu init\uuuu.py中删除警告,修复了使用Python 2的所有本地项目和工具的此问题

只需删除文件末尾的剪贴,并删除
\uuuuu init\uuuuu.pyc
文件,以便用更改重新编译:

if sys.version_info[0] == 2:
warnings.warn(
    "Python 2 is no longer supported by the Python core team. Support for "
    "it is now deprecated in cryptography, and will be removed in the "
    "next release.",
    CryptographyDeprecationWarning,
    stacklevel=2,
)

您在不同的环境中安装了什么版本的
加密
模块。此警告仅在2018年初添加到git存储库:。能否将加密模块锁定到较旧的版本-您将不会收到这些警告?我假设你只是在系统上安装了一个旧版本的模块,你没有收到警告。好吧,2.2.2在本地为我删除了警告,但现在我的困惑是因为:a)我用virtualenvs运行我所有的东西,加密软件包不存在并且不重要,除非我通过安装过程安装它。那么,为什么我的安装进程正在安装的那个程序会远程生成警告,而不是本地生成警告呢。b) 也就是说,我很确定,当我要求我们的devops团队更新服务器的资源调配时,他们没有将其绑定到特定的版本。因此,服务器也应该有最新版本。想法?对不起,不知道你的过程是什么,所以我无法回答为什么。我正在尽我所能为你解释清楚。这没有什么魔力。它们实际上只是PIP安装。我想我一定是错过了什么。是的,但有时如果你的手。这对我也很有效。尝试了所有的最新版本,直到它消失。最初的问题是一个一般的Python密码警告。“这与帕拉米科无关!”达斯蒂诺雷亚明白了,也许我应该澄清帕拉米科是在为我抛出密码警告。这就是我的答案。道歉如果让人困惑的话。我只是想减少观察家认为这可能是针对帕拉米科的。任何抛出警告的操作都是由于它们都在使用的加密包中的问题而导致的。有用的应该导入
警告
而不是
警告
尝试了您的解决方案,但是。。。AttributeError:“module”对象没有属性“DeprecatedIn23”@AleksandarPavić您使用的是什么版本的Python?为了破解代码并找到这样的解决方案,我尝试了整个过程的逆向工程,但一无所获。这是有用的知道。非常感谢!把这个放在正确的地方是我唯一能消除这种木头噪音的方法。