AttributeError: o módulo 'time' não tem nenhum atributo 'clock' no Python 3.8

23

Eu escrevi código para gerar chaves públicas e privadas. Funciona muito bem no Python 3.7, mas falha no Python 3.8. Não sei como falha na versão mais recente. Me ajude com algumas soluções.

Aqui está o código:

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)

Erro na versão 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'
Smack Alpha
fonte
referenciado aqui na Crytpo lib: github.com/dlitz/pycrypto/issues/283 Mas o ticket não parece estar fechado há um ano.
Fabien Antoine

Respostas:

22

No documento Python 3.8 :

A função time.clock()foi removida, após ter sido descontinuada desde o Python 3.3: use time.perf_counter()ou time.process_time(), em vez disso, dependendo de seus requisitos, para ter um comportamento bem definido. (Contribuição de Matthias Bussonnier em bpo-36895 .)

Angus Tay
fonte
1

O módulo usado para gerar a chave chama um método que foi depreciado desde o python 3.3 time.clock () .

Você pode fazer o downgrade para python 3.7 ou alterar o código-fonte para substituí-lo. Você deve abrir um problema para isso também.

Florian Bernard
fonte
0
AttributeError: module 'time' has no attribute 'clock' 

Ele foi descontinuado, conforme dito, o que significa apenas usar as versões mais recentes das bibliotecas que possuem esse módulo. Por exemplo, dependendo da dependência que você possui, remova e instale

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

A idéia é que você não precisa fazer o downgrade da sua versão python, pois isso o alcançará mais tarde. Apenas atualize os pacotes para os mais recentes, compatíveis com o Python 3.8

joash
fonte