87

我编写了代码来生成公钥和私钥。它在 Python 3.7 中运行良好,但在 Python 3.8 中失败。我不知道它在最新版本中是如何失败的。帮我解决一些问题。

这是代码:

from Crypto.PublicKey import RSA


def generate_keys():
    modulus_length = 1024
    key = RSA.generate(modulus_length)
    pub_key = key.publickey()
    private_key = key.exportKey()
    public_key = pub_key.exportKey()
    return private_key, public_key


a = generate_keys()
print(a)

Python 3.8 版本中的错误:

Traceback (most recent call last):
  File "temp.py", line 18, in <module>
    a = generate_keys()
  File "temp.py", line 8, in generate_keys
    key = RSA.generate(modulus_length)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/PublicKey/RSA.py", line 508, in generate
    obj = _RSA.generate_py(bits, rf, progress_func, e)    # TODO: Don't use legacy _RSA module
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/PublicKey/_RSA.py", line 50, in generate_py
    p = pubkey.getStrongPrime(bits>>1, obj.e, 1e-12, randfunc)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Util/number.py", line 282, in getStrongPrime
    X = getRandomRange (lower_bound, upper_bound, randfunc)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Util/number.py", line 123, in getRandomRange
    value = getRandomInteger(bits, randfunc)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Util/number.py", line 104, in getRandomInteger
    S = randfunc(N>>3)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 202, in read
    return self._singleton.read(bytes)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 178, in read
    return _UserFriendlyRNG.read(self, bytes)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 129, in read
    self._ec.collect()
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 77, in collect
    t = time.clock()
AttributeError: module 'time' has no attribute 'clock'
4

15 回答 15

100

来自Python 3.8 文档

time.clock()自 Python 3.3 起已弃用该函数后,该函数已被删除:根据您的要求,使用time.perf_counter()time.process_time()改为具有明确定义的行为。(由 Matthias Bussonnier 在bpo-36895中贡献。)

于 2019-10-26T08:59:08.423 回答
79

检查您是否正在使用 PyCrypto,如果是,请将其卸载并安装PyCryptodom,它是 PyCrypto 的一个分支

如项目问题页面所述,PyCrypto 已死

由于这两个库可以共存,这也可能是一个问题

pip3 uninstall PyCrypto
pip3 install -U PyCryptodome
于 2020-06-22T17:23:27.870 回答
55

time.clock()在 3.8 中被删除,因为它具有平台相关的行为

  • Unix上,这将返回当前处理器时间(以秒为单位)

  • Windows上,这将返回挂钟时间(以秒为单位)

    # I ran this test on my dual-boot system as demonstration:
    print(time.clock()); time.sleep(10); print(time.clock())
    # Linux:    0.0382 --------------------------->  0.0384
    # Windows: 26.1224 ---------------------------> 36.1566
    

那么选择哪个功能呢?

  • 处理器时间:这是该特定进程在 CPU 上主动执行所花费的时间。睡眠、等待 Web 请求或仅执行其他进程的时间不会对此产生影响。

    • 利用time.process_time()
  • 挂钟时间:这是指“挂在墙上的时钟”已经过去了多少时间,即在实时之外。

    • 利用time.perf_counter()

      • time.time()还可以测量挂钟时间,但可以重置,所以你可以回到过去
      • time.monotonic()无法重置(单调 = 仅向前)但精度低于time.perf_counter()
于 2020-05-30T20:48:45.450 回答
12

原因: time.clock已弃用

解决方案:

步骤1

  • 只需转到您的C 文件夹并在搜索栏中搜索站点包。你会看到这样的结果:

网站包

  • 右键单击标记为红色的此结果,然后打开文件位置

  • 然后查找sqlalchemy/util/compat.py文件并打开它。并使用 ctrl+f 搜索time.clock并将其替换为time.time

第2步

  • 转到您的错误最后一行并转到该目录并打开该特定文件。
  • 使用 ctrl+f搜索time.clock并将其替换为time.time
于 2021-02-13T02:55:03.433 回答
6

发布这个丑陋的猴子补丁:

import time
time.clock = time.time

作为最后的手段,但不推荐。

于 2021-11-01T21:13:43.240 回答
4

转到代码 C:\Users\Mr\anaconda3\envs\pythonProject2\Lib\site-packages\sqlalchemy\util 并选择 compat.py 并time.clock在代码中搜索。

然后替换time.clocktime.time并保存。

于 2020-10-28T16:02:53.250 回答
3

time.clock在许多旧图书馆中使用。现在time.clock已删除,必须单击错误中给出的路径。这会将您导航到time.clock写入的行,然后将其更改为time.time.

于 2021-04-20T19:03:34.230 回答
3
AttributeError: module 'time' has no attribute 'clock' 

如前所述,它已被弃用,这意味着只使用具有该模块的最新版本的库。例如,根据您拥有的依赖项,删除和安装

Crypto==1.4.1, or Mako==1.1.2 or SQLAlchemy==1.3.6 //etc

这个想法是你不必降级你的python版本,因为这会在以后赶上你。只需将软件包更新为与 Python 3.8 兼容的较晚版本

于 2020-03-04T06:33:00.113 回答
2

您用于生成密钥的模块调用自 python 3.3 time.clock()以来已被贬值的方法。

您可以降级到 python 3.7 或更改源代码以替换它。您也应该为此打开一个问题。

于 2019-10-26T08:58:23.300 回答
2

打开文件并转到错误消息中指出的行,将time.clock()行更改为time.perf_counter(),如果仍然无法正常工作,请将其修改为time.time

于 2021-06-17T17:17:01.560 回答
1

只需打开文件“/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py”,第 77 行

并从

 t = time.clock()

 t = time.time
于 2021-10-26T15:04:57.220 回答
1

我在我的项目 neehack.com 中使用 AES 加密字符串时遇到了同样的问题,我通过更新venv/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py第 77 行来修复它t = time.time(),现在它已修复。

于 2020-12-06T23:46:30.767 回答
0

如果您涉及数据库,请升级它。

pip install --upgrade flask_sqlalchemy
于 2021-03-19T15:48:30.860 回答
0

打开调试错误行的文件。并将 t = time.clock() 更改为 t = time.time

于 2021-12-08T09:05:08.003 回答
0

就我而言,我将time.clock()替换为time.time()

于 2022-01-23T15:10:12.713 回答