簡體   English   中英

為 BigQuery Python CLI 設置 GOOGLE_APPLICATION_CREDENTIALS

[英]Setting GOOGLE_APPLICATION_CREDENTIALS for BigQuery Python CLI

我正在嘗試使用 Python 通過 BigQuery API 連接到 Google BigQuery。

我在這里關注此頁面: https ://cloud.google.com/bigquery/bigquery-api-quickstart

我的代碼如下:

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 __name__ == '__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)

但是,當我通過終端運行此代碼時,出現以下錯誤:

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.

正如您在代碼中看到的,我嘗試根據錯誤中的鏈接設置GOOGLE_APPLICATION_CREDENTIALS 但是,錯誤仍然存​​在。 有誰知道問題是什么?

先感謝您。

首先-感謝您的代碼-這非常有用。 我還建議直接在您的代碼中添加設置環境變量 - 因為不要為您工作的每個環境都設置它。 您可以使用以下代碼:

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

在需要不同憑據的不同項目之間切換時,我發現這很有用。

我不確定BigQuery ,但我正在使用Google Data Store進行保存。 如果你已經在你的 mac 中安裝了gcloud sdk ,你可以嘗試運行這個命令

gcloud auth application-default login

它正在尋找本地 UNIX(或其他)環境中的環境變量,而不是 python 腳本中的變量。

您可以通過打開終端或 cygwin 並執行以下操作之一來設置它:

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

將其輸入您的終端以設置此會話的變量

在 UNIX 中通過鍵入 nano ~/.bashrc 打開您的 .bashrc 文件,如果您看到該標題,請將此行添加到用戶特定別名下:

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

然后通過鍵入 source ~/.bashrc 重新加載它,並通過嘗試echo $GOOGLE_APPLICATION_CREDENTIALS確認它已設置。 如果它返回路徑,那很好。

注意: oauth2client 已棄用,您可以使用google.auth.default() 代替 GoogleCredentials.get_application_default() GoogleCredentials.get_application_default() 首先安裝軟件包:

pip install google-auth

在您的具體示例中,我看到您從代碼中知道 JSON 文件的位置。 您可以直接將服務帳戶google.oauth2.service_account模塊一起使用,而不是默認憑據(來自環境變量)。

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

您可以像當前一樣使用此憑據文件,方法是將它們傳遞給googleapiclient.discovery.build ,或者如果您使用的是google-cloud-bigquery library ,請將憑據傳遞給google.cloud.bigquery.Client構造函數。

GOOGLE_APPLICATION_CREDENTIALS 未找到 C# 的錯誤解決方案

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

它正在尋找環境變量。 但是我能夠通過使用應用程序默認憑據在 Windows 平台上解決這個問題。

我遵循的步驟:

  • 已安裝谷歌 SDK
  • 然后執行gcloud init步驟以指定我的默認憑據和默認項目,您可以在需要時更改它們。 gcloud可執行文件可以在您選擇安裝 Google SDK 的bin目錄中找到。
  • 成功提供憑據后,您可以在位置C:\Users\"yourusername"\AppData\Roaming\gcloud\legacy_credentials\"youremail" 您可以在那里找到以 JSON 格式存儲的憑據。

它幫助我解決了錯誤。

除了使用GOOGLE_APPLICATION_CREDENTIALS (已經在一堆答案中描述)之外,還有另一種方法可以將生成的 json 憑據設置為默認服務帳戶:

gcloud auth activate-service-account --key-file=<path to your generated json file>

這將激活默認帳戶(並根據提供的 json 文件設置憑據)而無需顯式設置GOOGLE_APPLICATION_CREDENTIALS ,並且在重新登錄或重新啟動后仍將激活而不修改 .bashrc。

錯誤消息中提供的鏈接https://developers.google.com/identity/protocols/application-default-credentials表示將環境變量設置為指向包含 JSON 服務憑據的失敗。 看起來你設置了一個 Python 變量。 嘗試將終端的環境變量設置為指向正確的文件。

當您不在 GCE 容器中運行時,另一種方法是顯式使用其他憑據,例如oauth2client.client.SignedJwtAssertionCredentials並將其直接指向您的客戶端密碼,這樣您就不必通過環境變量進行間接訪問。

如果您想在不設置環境變量的情況下使用不同的憑證文件,可以使用以下代碼:

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']))

我認為這里還沒有提到另一種解決方法。 google.oauth2.service_account.Credentials對象提供了from_service_account_info方法(參見此處: https ://github.com/googleapis/google-auth-library-python/blob/main/google/oauth2/service_account.py)。

因此,您可以在環境中設置所需的任何變量並將其讀入並將其傳遞給函數,如下所示:

your_data = { 
"type": os.environ.get('YOUR_ENV_VAR'),
"project_id": os.environ.get('YOUR_ENV_VAR'),
"private_key_id": os.environ.get('YOUR_ENV_VAR'),
#... and so on with all the required Google variables....
}
your_credentials = service_account.Credentials.from_service_account_info(your_data, scopes=your_scopes)
service = discovery.build(api_name, api_version, credentials=your_credentials)

我基本上從我的 google keyfile.json 中獲取了所有數據並將它們存儲在 env 中並執行了上述操作。 這樣你就不需要把你的 keyfile.json 保存在你的代碼附近,或者更糟的是,把它上傳到公共的地方。 基本上就是這樣。 祝你好運!

PS:我也忘了提及這一點,這可能會對遇到與我相同的問題的人有所幫助。 雖然上述內容在開發中應該可以正常工作,但在某些生產環境中, \n不會被解釋為新行。 相反,它將保留在私鑰內。 將以上所有內容放入 try 語句中,如果您遇到錯誤:“無法檢測到密鑰”,那么這很可能是問題所在。 在這種情況下,您需要將所有\\n替換為\n類似於 Sumit Agrawal 所建議的內容,但有點相反。 這是因為在某些環境中,會為新行指示(例如\n )自動添加\ ,以便在有意義的情況下使它們保持原樣。 所以你必須基本上撤消這個。

您可以簡單地對上述行之一執行以下操作: "private_key": os.environ.get('YOUR_ENV_VAR').replace('\\n', '\n'),

但再次嘗試將它們打印到日志文件/控制台以查看它們的實際外觀。 如果您知道字符串中有任何\n ,則您需要按照說明清理或轉換它們。 祝你好運!

您可以使用from_service_account_json()創建具有服務帳戶憑據的客戶端:

from google.cloud import bigquery
bigqueryClient = bigquery.Client.from_service_account_json('/path/to/keyfile.json')

在您的項目文件夾中,只需鍵入:

set GOOGLE_APPLICATION_CREDENTIALS='\path\key.json'
  • 從命令行導出 Google 憑據 JSON:
    export GOOGLE_APPLICATION_CREDENTIALS='\path\key.json'
    我希望它會正常工作。

如果在某些情況下您無法在文件集中提供憑據GOOGLE_APPLICATION_CREDENTIALS='\path\key.json'

  1. 由於服務帳戶是 JSON 並且它包含雙引號字符,因此將每個雙引號替換為\"
  2. 將完整的 JSON 用雙引號括起來
  3. 將每個\n替換為\\n (在 linux 上) \\\n (在 mac 上)

如果您將其導出為變量,則服務帳戶的上述更改應正確記錄。

嘗試echo %variable_name以確認它是否看起來不錯。

在 Windows 上,更新“您帳戶的環境變量”。 您很可能已經有一個名為:GOOGLE_APPLICATION_CREDENTIALS 的變量,只需將路徑更新為 /path/to/liquid-optics-xxxxxxxx.json(您很可能在計算機上的某個位置擁有該文件)。 然后刷新您的環境(cmd 或其他)以獲取更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM