![](/img/trans.png)
[英]Set GOOGLE_APPLICATION_CREDENTIALS in Python project to use Google API
[英]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 平台上解決這個問題。
我遵循的步驟:
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'
export GOOGLE_APPLICATION_CREDENTIALS='\path\key.json'
如果在某些情況下您無法在文件集中提供憑據GOOGLE_APPLICATION_CREDENTIALS='\path\key.json'
\"
\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.