AttributeError: module 'time' has no attribute 'clock' in Python 3.8

PythonAttributeerrorPycryptoPython 3.8

Python Problem Overview


I have written code to generate public and private keys. It works great at Python 3.7 but it fails in Python 3.8. I don't know how it fails in the latest version. Help me with some solutions.

Here's the 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)

Error in Python 3.8 version:

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'

Python Solutions


Solution 1 - Python

From the Python 3.8 doc:

>The function time.clock() has been removed, after having been deprecated since Python 3.3: use time.perf_counter() or time.process_time() instead, depending on your requirements, to have well-defined behavior. (Contributed by Matthias Bussonnier in bpo-36895.)

Solution 2 - Python

Check if you are using PyCrypto, if yes, uninstall it and install PyCryptodome which is a fork of PyCrypto

PyCrypto is dead as mentioned on project issue page

Since both these libraries can coexist, it could be an issue too

pip3 uninstall PyCrypto
pip3 install -U PyCryptodome

Solution 3 - Python

time.clock() was removed in 3.8 because it had platform-dependent behavior:

  • On Unix, this returns the current processor time (in seconds)

  • On Windows, this returns wall-clock time (in seconds)

    # 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
    

So which function to pick instead?

  • Processor Time: This is how long this specific process spends actively being executed on the CPU. Sleep, waiting for a web request, or time when only other processes are executed will not contribute to this.

    • Use time.process_time()
  • Wall-Clock Time: This refers to how much time has passed "on a clock hanging on the wall", i.e. outside real time.

    • Use time.perf_counter()

      • time.time() also measures wall-clock time but can be reset, so you could go back in time
      • time.monotonic() cannot be reset (monotonic = only goes forward) but has lower precision than time.perf_counter()

Solution 4 - Python

Reason: time.clock is deprecated

Solution:

Step 1

  • Just go to your C folder and search site-packages in the search bar. You will see the result like this:

site-packages

  • Right click on this result marked as Red, and open file location.

  • Then look for sqlalchemy/util/compat.py file and open it. And search time.clock using ctrl+f and replace it with time.time

Step 2

  • Go to your error last line and go to that directory and open that particular file.

  • search time.clock using ctrl+f and replace it with time.time

Solution 5 - Python

Necroposting this ugly monkey patch:

import time
time.clock = time.time

Works as a last resort, but not recommended.

Solution 6 - Python

Go to the the code C:\Users\Mr\anaconda3\envs\pythonProject2\Lib\site-packages\sqlalchemy\util and select compat.py and search for time.clock in code.

Then replace time.clock with time.time and save it.

Solution 7 - Python

The module you use to generate key call a method that have been depreciated since python 3.3 time.clock().

You could downgrade to python 3.7 or change the source code to replace it. You should open an issue for that as well.

Solution 8 - Python

AttributeError: module 'time' has no attribute 'clock' 

It is deprecated as said which means just use the latest versions of libraries that have that module. For example, depending on the dependency you have, Remove and Install

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

The idea is you don't have to downgrade your python version as this will catch up with you later. Just update the packages to more late ones which are compatible with Python 3.8

Solution 9 - Python

time.clock is used in many old libraries. Now that time.clock is removed, one must click on the path given in the error. This will navigate you to the line where time.clock is written, and just change it to time.time.

Solution 10 - Python

Open the file and go to the line as pointed in the error message, change the time.clock() line to time.perf_counter(), if it still doesn't work modify it to time.time

Solution 11 - Python

I had the same issue for encrypting a string using AES in my project neehack.com and I fixed it by updating venv/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py line 77 to t = time.time() and it is now fixed.

Solution 12 - Python

Just open File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 77

and change from

 t = time.clock()

to

 t = time.time

Solution 13 - Python

In my case I replace time.clock() with time.time()

Solution 14 - Python

If you have database involved, upgrade it.

pip install --upgrade flask_sqlalchemy

Solution 15 - Python

Open file that debug error line. And change t = time.clock() to t = time.time

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser11576444View Question on Stackoverflow
Solution 1 - PythonAngus TayView Answer on Stackoverflow
Solution 2 - PythonHimanshu SheoranView Answer on Stackoverflow
Solution 3 - PythonxjclView Answer on Stackoverflow
Solution 4 - PythonSARIMView Answer on Stackoverflow
Solution 5 - PythonfviktorView Answer on Stackoverflow
Solution 6 - PythonSATHVIKA THUMMALAView Answer on Stackoverflow
Solution 7 - PythonFlorian BernardView Answer on Stackoverflow
Solution 8 - PythonjoashView Answer on Stackoverflow
Solution 9 - PythonSiddhesh KhadapkarView Answer on Stackoverflow
Solution 10 - PythonRAHUL SINGHView Answer on Stackoverflow
Solution 11 - PythonMorariJanView Answer on Stackoverflow
Solution 12 - PythonLong Lê HoàngView Answer on Stackoverflow
Solution 13 - PythonZia KhanView Answer on Stackoverflow
Solution 14 - PythonJefferson SankaraView Answer on Stackoverflow
Solution 15 - PythonKairat KoibagarovView Answer on Stackoverflow