web-dev-qa-db-fra.com

Définition de GOOGLE_APPLICATION_CREDENTIALS pour la CLI BigQuery Python

J'essaie de me connecter à Google BigQuery via l'API BigQuery, à l'aide de Python. 

Je suis cette page ici: https://cloud.google.com/bigquery/bigquery-api-quickstart

Mon code est le suivant:

import os
import argparse

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.client import GoogleCredentials

GOOGLE_APPLICATION_CREDENTIALS = './Peepl-cb1dac99bdc0.json'

def main(project_id):
    # Grab the application's default credentials from the environment.
    credentials = GoogleCredentials.get_application_default()
    print(credentials)
    # Construct the service object for interacting with the BigQuery API.
    bigquery_service = build('bigquery', 'v2', credentials=credentials)

    try:
        query_request = bigquery_service.jobs()
        query_data = {
            'query': (
                'SELECT TOP(corpus, 10) as title, '
                'COUNT(*) as unique_words '
                'FROM [publicdata:samples.shakespeare];')
        }

        query_response = query_request.query(
            projectId=project_id,
            body=query_data).execute()

        print('Query Results:')
        for row in query_response['rows']:
            print('\t'.join(field['v'] for field in row['f']))

    except HttpError as err:
        print('Error: {}'.format(err.content))
        raise err


if __== '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('project_id', help='Your Google Cloud Project ID.')

    args = parser.parse_args()

    main(args.project_id)

Cependant, lorsque j'exécute ce code via le terminal, l'erreur suivante apparaît: 

oauth2client.client.ApplicationDefaultCredentialsError: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.

Comme vous pouvez le constater dans le code, j'ai essayé de définir le GOOGLE_APPLICATION_CREDENTIALS conformément au lien de l'erreur. Cependant, l'erreur persiste. Quelqu'un sait-il quel est le problème? 

Merci d'avance. 

15
Colin

Il recherche la variable d'environnement dans votre environnement UNIX local (ou autre), pas une variable dans votre script python.

Pour ce faire, ouvrez votre terminal ou votre centre de distribution et effectuez l'une des opérations suivantes:

export GOOGLE_APPLICATION_CREDENTIALS='/path/to/your/client_secret.json'

Tapez cela dans votre terminal pour définir la variable pour cette session seulement

Ouvrez votre fichier .bashrc sous UNIX en tapant nano ~/.bashrc et ajoutez-y cette ligne sous des alias spécifiques à l'utilisateur si vous voyez cet en-tête:

GOOGLE_APPLICATION_CREDENTIALS="/full/path/to/your/client_secret.json"

Rechargez-le ensuite en tapant la source ~/.bashrc et confirmez que le jeu est défini en essayant echo $GOOGLE_APPLICATION_CREDENTIALS. Si cela retourne le chemin, tout va bien.

20
Wolf Rendall

Premièrement - Merci pour le code - cela à condition que cela soit très utile ... Je suggère également d'ajouter le réglage de la variable d'environnement directement dans votre code code suivant:

import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "path_to_your_.json_credential_file"

J'ai trouvé cela utile lors du basculement entre différents projets nécessitant des informations d'identification différentes.

28
Roee Anuar

Je ne suis pas sûr de BigQuery, mais j'utilise Google Data Store pour la sauvegarde. Si vous avez installé gcloud sdk sur votre Mac, vous pouvez essayer d’exécuter cette commande.

gcloud auth application-default login
17
arthankamal

Remarque: oauth2client est obsolète . Au lieu de GoogleCredentials.get_application_default(), vous pouvez utiliser google.auth.default () . Installez d'abord le paquet avec:

pip install google-auth

Dans votre exemple spécifique, je vois que vous savez où se trouve le fichier JSON à partir de votre code. Au lieu des informations d'identification par défaut (des variables d'environnement), vous pouvez utiliser un compte de service directement avec le module google.oauth2.service_account .

credentials = google.oauth2.service_account.from_service_account_file(
    './Peepl-cb1dac99bdc0.json',
    scopes=['https://www.googleapis.com/auth/cloud-platform'])

Vous pouvez utiliser ce fichier d'informations d'identification comme vous le faites actuellement en le transmettant à googleapiclient.discovery.build ou, si vous utilisez la bibliothèque google-cloud-bigquery , transmettez les informations d'identification à google.cloud. constructeur bigquery.Client .

4
Tim Swast

Le lien fourni dans le message d'erreur, https://developers.google.com/identity/protocols/application-default-credentials , indique de définir la variable environment pour pointer sur l'échec contenant Informations d'identification du service JSON. Il semble que vous définissiez une variable Python. Essayez de définir la variable d’environnement de votre terminal pour pointer vers le bon fichier.

Une autre solution consisterait à utiliser explicitement d'autres informations d'identification lorsque vous n'exécutez pas dans un conteneur GCE, comme oauth2client.client.SignedJwtAssertionCredentials, et dirigez-les directement vers le secret de votre client afin que vous n'ayez pas à indirectement utiliser une variable d'environnement.

2
Michael Sheldon

C'est à la recherche de la variable d'environnement. Mais j'ai pu résoudre ce problème sur la plate-forme Windows en utilisant des informations d'identification par défaut de l'application. 

Les étapes que j'ai suivies:

  • SDK Google installé
  • Exécutez ensuite les étapes gcloud init pour spécifier mes informations d’identification par défaut et mon projet par défaut que vous pouvez modifier à tout moment. gcloud exécutable peut être situé dans le répertoire bin où vous avez choisi d'installer Google SDK. 
  • Après avoir fourni les informations d'identification, vous pouvez vous enregistrer à l'emplacement C:\Users\"yourusername"\AppData\Roaming\gcloud\legacy_credentials\"youremail". Vous pouvez y trouver les informations d'identification stockées au format JSON.

Cela m'a aidé à résoudre l'erreur.

1

GOOGLE_APPLICATION_CREDENTIALS PAS TROUVÉ DE SOLUTION D'ERREUR POUR C # 

System.Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS",@"C:\apikey.json");
string Pathsave = System.Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS");
1
Hakkı Eser

Si vous souhaitez utiliser différents fichiers d'informations d'identification sans définir la variable d'environnement, vous pouvez utiliser le code suivant:

from oauth2client import service_account
from apiclient.discovery import build
import json

client_credentials = json.load(open("<path to .json credentials>"))

credentials_token = service_account._JWTAccessCredentials.from_json_keyfile_dict(client_credentials)

bigquery_service = build('bigquery', 'v2', credentials=credentials_token)
query_request = bigquery_service.jobs()
query_data = {
    'query': (
            'SELECT TOP(corpus, 10) as title, '
            'COUNT(*) as unique_words '
            'FROM [publicdata:samples.shakespeare];')
    }

query_response = query_request.query(
           projectId=project_id,
           body=query_data).execute()

print('Query Results:')
for row in query_response['rows']:
    print('\t'.join(field['v'] for field in row['f']))
0
Roee Anuar