google-api-python-client broken because of OAuth2?
Question: I am trying to check if a certain dataset exists in bigquery using the Google
Api Client in Python. It always worked untill the last update where I got this
strange error I don't know how to fix:

    
    
    Traceback (most recent call last):
      File "/root/miniconda/lib/python2.7/site-packages/dsUtils/bq_utils.py", line 106, in _get
        resp = bq_service.datasets().get(projectId=self.project_id, datasetId=self.id).execute(num_retries=2)
      File "/root/miniconda/lib/python2.7/site-packages/oauth2client/util.py", line 140, in positional_wrapper
        return wrapped(*args, **kwargs)
      File "/root/miniconda/lib/python2.7/site-packages/googleapiclient/http.py", line 755, in execute
        method=str(self.method), body=self.body, headers=self.headers)
      File "/root/miniconda/lib/python2.7/site-packages/googleapiclient/http.py", line 93, in _retry_request
        resp, content = http.request(uri, method, *args, **kwargs)
      File "/root/miniconda/lib/python2.7/site-packages/oauth2client/client.py", line 598, in new_request
        self._refresh(request_orig)
      File "/root/miniconda/lib/python2.7/site-packages/oauth2client/client.py", line 864, in _refresh
        self._do_refresh_request(http_request)
      File "/root/miniconda/lib/python2.7/site-packages/oauth2client/client.py", line 891, in _do_refresh_request
        body = self._generate_refresh_request_body()
      File "/root/miniconda/lib/python2.7/site-packages/oauth2client/client.py", line 1597, in _generate_refresh_req
    uest_body
        assertion = self._generate_assertion()
      File "/root/miniconda/lib/python2.7/site-packages/oauth2client/service_account.py", line 263, in _generate_ass
    ertion
        key_id=self._private_key_id)
      File "/root/miniconda/lib/python2.7/site-packages/oauth2client/crypt.py", line 97, in make_signed_jwt
        signature = signer.sign(signing_input)
      File "/root/miniconda/lib/python2.7/site-packages/oauth2client/_pycrypto_crypt.py", line 101, in sign
        return PKCS1_v1_5.new(self._key).sign(SHA256.new(message))
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/Signature/PKCS1_v1_5.py", line 112, in sign
        m = self._key.decrypt(em)
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/PublicKey/RSA.py", line 174, in decrypt
        return pubkey.pubkey.decrypt(self, ciphertext)
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/PublicKey/pubkey.py", line 93, in decrypt
        plaintext=self._decrypt(ciphertext)
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/PublicKey/RSA.py", line 235, in _decrypt
        r = getRandomRange(1, self.key.n-1, randfunc=self._randfunc)
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/Util/number.py", line 123, in getRandomRange
        value = getRandomInteger(bits, randfunc)
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/Util/number.py", line 104, in getRandomInteger
        S = randfunc(N>>3)
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 202, in read
        return self._singleton.read(bytes)
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 178, in read
        return _UserFriendlyRNG.read(self, bytes)
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 137, in read
        self._check_pid()
      File "/root/miniconda/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 153, in _check_pid
        raise AssertionError("PID check failed. RNG must be re-initialized after fork(). Hint: Try Random.atfork()")
    AssertionError: PID check failed. RNG must be re-initialized after fork(). Hint: Try Random.atfork()
    

Is someone understanding what is hapening?

Note that I also get this error with other bricks like GCStorage.

Note also that I use the following command to load my Google credentials:

    
    
    from oauth2client.client import GoogleCredentials
    
    def get_credentials(credentials_path):  #my json credentials path
        logger.info('Getting credentials...')
        try:
            os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = credentials_path
            credentials = GoogleCredentials.get_application_default()
            return credentials
        except Exception as e:
            raise e
    

So if anyone know a better way to load my google credentials using my json
service account file, and which would avoid the error, please tell me.


Answer: It looks like the error is in the PyCrypto module, which appears to be used
under the hood by Google's OAuth2 implementation. If your code is calling
`os.fork()` at some point, you may need to call `Crypto.Random.atfork()`
afterward in both the parent and child process in order to update the module's
internal state.

See here for PyCrypto docs; search for "atfork" for more info:
<https://github.com/dlitz/pycrypto>

This question and answer might also be relevant: [PyCrypto :
AssertionError("PID check failed. RNG must be re-initialized after fork().
Hint: Try
Random.atfork()")](http://stackoverflow.com/questions/16981503/pycrypto-
assertionerrorpid-check-failed-rng-must-be-re-initialized-after-fo)

