119 votes

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

J'ai écrit un code pour générer des clés publiques et privées. Il fonctionne très bien sous Python 3.7 mais échoue sous Python 3.8. Je ne sais pas comment il échoue dans la dernière version. Aidez-moi à trouver des 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'

123voto

Angus Tay Points 1204

Desde el Documentation sur Python 3.8 :

La fonction time.clock() a été supprimé, après avoir été déprécié depuis Python 3.3 : utiliser time.perf_counter() o time.process_time() au lieu, en fonction de vos besoins, d'avoir un comportement bien défini. (Contribué par Matthias Bussonnier dans bpo-36895 .)

105voto

Himanshu Sheoran Points 646

Vérifiez si vous utilisez PyCrypto, si oui, désinstallez-le et installez-le. PyCryptodome qui est un fork de PyCrypto

PyCrypto est mort comme mentionné sur page d'enjeux du projet

Étant donné que ces deux bibliothèques peuvent coexister, cela pourrait également poser problème.

pip3 uninstall PyCrypto
pip3 install -U PyCryptodome

74voto

xjcl Points 608

time.clock() était supprimé en 3.8 parce qu'il avait comportement dépendant de la plate-forme :

  • Sur Unix ce qui renvoie l'adresse actuelle temps processeur (en secondes)

  • Sur Windows ce qui donne heure de l'horloge murale (en secondes)

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

Alors quelle fonction choisir à la place ?

  • Durée du processeur : Il s'agit du temps que ce processus spécifique passe à être activement exécuté sur le CPU. Le sommeil, l'attente d'une requête web ou le temps pendant lequel seuls d'autres processus sont exécutés n'y contribuent pas.

    • Utilisez time.process_time()
  • Horloge murale : Il s'agit du temps écoulé "sur une horloge accrochée au mur", c'est-à-dire en dehors du temps réel.

    • Utilisez time.perf_counter()

      • time.time() mesure également l'heure de l'horloge murale, mais peut être remis à zéro, ce qui permet de remonter le temps.
      • time.monotonic() ne peut pas être remis à zéro (monotonique = va seulement en avant) mais a une précision plus faible que time.perf_counter()

19voto

Motif : time.clock est déprécié

Solution :

Étape 1 -

  • Il suffit d'aller sur votre Dossier C et recherche paquets de sites dans la barre de recherche. Vous verrez le résultat comme ceci.

site-packages

  • Clic droit sur ce résultat marqué en rouge, et emplacement du fichier ouvert

  • Alors, cherchez sqlalchemy/util/compat.py et l'ouvrir. Et cherchez temps.horloge en utilisant ctrl+f et le remplacer par temps.temps

Étape 2 -

  • Sauter votre erreur dernière ligne et aller dans ce répertoire et ouvrir ce fichier particulier.
  • recherche temps.horloge en utilisant ctrl+f et le remplacer par temps.temps

J'espère que vous le trouverez utile. Votez en haut. Bon codage.

5voto

Accédez au code C:\Users\Mr\anaconda3\envs\pythonProject2\Lib\site -packages \sqlalchemy\util et sélectionnez compat.py et recherchez time.clock en code.

Alors, remplacez time.clock con time.time et le sauvegarder.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X