webentwicklung-frage-antwort-db.com.de

GOOGLE_APPLICATION_CREDENTIALS für BigQuery Python-CLI festlegen

Ich versuche, über die BigQuery-API mit Python eine Verbindung zu Google BigQuery herzustellen. 

Ich folge dieser Seite hier: https://cloud.google.com/bigquery/bigquery-api-quickstart

Mein Code lautet wie folgt:

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)

Wenn ich diesen Code über das Terminal ausführen, erhalte ich jedoch die folgende Fehlermeldung: 

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.

Wie Sie im Code sehen können, habe ich versucht, den GOOGLE_APPLICATION_CREDENTIALS gemäß der Verknüpfung im Fehler festzulegen. Der Fehler bleibt jedoch bestehen. Weiß jemand, worum es geht? 

Danke im Voraus. 

15
Colin

Es sucht nach der Umgebungsvariablen in Ihrer lokalen UNIX-Umgebung (oder einer anderen), nicht nach einer Variablen in Ihrem Python-Skript.

Sie haben dies festgelegt, indem Sie Ihr Terminal oder cygwin geöffnet haben und eine der folgenden Aktionen ausführen:

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

Geben Sie das in Ihr Terminal ein, um die Variable nur für diese Sitzung festzulegen

Öffnen Sie Ihre .bashrc-Datei in UNIX, indem Sie nano ~/.bashrc eingeben und fügen Sie diese Zeile unter benutzerspezifischen Aliasnamen hinzu, wenn Sie diesen Header sehen:

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

Laden Sie es dann erneut durch Eingabe von source ~/.bashrc und bestätigen Sie die Einstellung, indem Sie echo $GOOGLE_APPLICATION_CREDENTIALS versuchen. Wenn der Pfad zurückgegeben wird, sind Sie gut.

20
Wolf Rendall

Erstens - Vielen Dank für den Code - dies war sehr nützlich. Ich würde auch vorschlagen, die Umgebungsvariable direkt in Ihrem Code zu setzen - um sie nicht für jede Umgebung festzulegen, in der Sie arbeiten. Sie können die folgenden Code:

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

Ich fand dies nützlich, wenn Sie zwischen verschiedenen Projekten wechseln, für die unterschiedliche Anmeldeinformationen erforderlich sind.

28
Roee Anuar

Ich bin nicht sicher über BigQuery, aber ich verwende Google Data Store zum Speichern. Wenn Sie gcloud sdk auf Ihrem Mac installiert haben, können Sie diesen Befehl ausführen

gcloud auth application-default login
17
arthankamal

Hinweis: oauth2client ist veraltet , anstelle von GoogleCredentials.get_application_default() können Sie google.auth.default () verwenden. Installieren Sie das Paket zuerst mit:

pip install google-auth

In Ihrem speziellen Beispiel wissen Sie, wo sich die JSON-Datei in Ihrem Code befindet. Anstelle von Standardanmeldeinformationen (von Umgebungsvariablen) können Sie verwenden Sie ein Dienstkonto direkt mit dem Modul google.oauth2.service_account .

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

Sie können diese Berechtigungsnachweisdatei genauso verwenden, wie Sie es derzeit tun, indem Sie sie an googleapiclient.discovery.build übergeben. Wenn Sie die Bibliothek google-cloud-bigquery library verwenden, übergeben Sie die Berechtigungsnachweise an google.cloud.bigquery.Client Konstruktor.

4
Tim Swast

Der in der Fehlermeldung angegebene Link https://developers.google.com/identity/protocols/application-default-credentials gibt an, dass der Umgebungsvariable so eingestellt ist, dass er auf den Fehler verweist enthält die JSON-Service-Berechtigungsnachweise. Es sieht so aus, als würden Sie eine Python-Variable festlegen. Stellen Sie die Umgebungsvariable Ihres Terminals so ein, dass sie auf die richtige Datei zeigt.

Eine Alternative wäre die explizite Verwendung anderer Anmeldeinformationen, wenn Sie nicht in einem GCE-Container ausgeführt werden, wie oauth2client.client.SignedJwtAssertionCredentials, und direkt auf das Clientgeheimnis verweisen, sodass Sie nicht durch eine Umgebungsvariable indirekt navigieren müssen.

2
Michael Sheldon

Es sucht nach der Umgebungsvariablen. Ich konnte dieses Problem jedoch auf der Windows-Plattform mithilfe von Anwendungs-Standardanmeldeinformationen lösen. 

Schritte, denen ich folgte:

  • Installiertes Google SDK
  • Führen Sie dann gcloud init-Schritte aus, um meine Standardanmeldeinformationen und das Standardprojekt anzugeben, die Sie bei Bedarf ändern können. Die gcloud-Programmdatei kann im Verzeichnis bin abgelegt werden, in dem Sie Google SDK installiert haben. 
  • Nach erfolgreicher Eingabe der Anmeldeinformationen können Sie am Speicherort C:\Users\"yourusername"\AppData\Roaming\gcloud\legacy_credentials\"youremail". einchecken. Dort finden Sie die im JSON-Format gespeicherten Anmeldeinformationen.

Es hat mir geholfen, den Fehler zu beheben.

1

GOOGLE_APPLICATION_CREDENTIALS - KEINE FEHLERLÖSUNG FÜR C # 

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

Wenn Sie andere Berechtigungsnachweisdateien verwenden möchten, ohne die Umgebungsvariable festzulegen, können Sie den folgenden Code verwenden:

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