web-dev-qa-db-fra.com

AttributeError: le module 'time' n'a pas d'attribut 'clock' dans Python 3.8

J'ai écrit du code pour générer des clés publiques et privées. Cela fonctionne très bien à Python 3.7 mais il échoue dans Python 3.8. Je ne sais pas comment il échoue dans la dernière version. Aidez-moi avec quelques solutions.

Voici le code:

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)

Erreur dans la version 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'
18
user11576444

Depuis le doc Python 3.8 :

La fonction time.clock() a été supprimée, après avoir été dépréciée depuis Python 3.3: utilisez plutôt time.perf_counter() ou time.process_time() à la place, selon vos exigences, pour avoir un comportement bien défini. (Contribution de Matthias Bussonnier in bpo-36895 .)

16
Angus Tay

Le module que vous utilisez pour générer la clé appelle une méthode qui s'est dépréciée depuis python 3.3 time.clock () .

Vous pouvez rétrograder vers python 3.7 ou changer le code source pour le remplacer. Vous devriez également ouvrir un problème pour cela.

1
Florian Bernard
AttributeError: module 'time' has no attribute 'clock' 

Il est obsolète comme dit, ce qui signifie qu'il suffit d'utiliser les dernières versions des bibliothèques qui ont ce module. Par exemple, selon la dépendance dont vous disposez, Supprimer et installer

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

L'idée est que vous n'avez pas besoin de rétrograder votre version python car cela vous rattrapera plus tard. Mettez simplement à jour les packages vers des versions plus tardives compatibles avec Python 3,8

0
joash