web-dev-qa-db-ja.com

Google Cloud関数-ImportError:「google.cloud」(不明な場所)から名前「pubsub」をインポートできません

_google.cloud.pubsub_v1_を使用して他のGoogle Cloud関数を開始するGoogle Cloud関数をデプロイしていますが、このエラーが発生しますImportError: cannot import name 'pubsub' from 'google.cloud' (unknown location)

私のrequirements.txtファイルの始まりは次のようになります

_# Function dependencies, for example:
# package>=version
google-cloud-pubsub
....
_

Main.pyスクリプトの始まりは次のようになります。

_import base64
import json
from google.cloud import pubsub_v1

publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(<PROJECT_ID>, <PUBSUB_TOPIC>)
_

このコードをGoogleCloud SourceRepositoryからデプロイしています。私は読み通しました this SO post 私のエラーについてですが、その質問はクライアントアプリケーションで発生するこのエラーについてのようです。私のエラーはGoogleによって生成されていますデプロイプロセス中のクラウド機能自体。Googleがプロセスの実行に使用している自動作成されたVM)に対するSudo権限がありませんか? _requirements.txt_ファイルからこの問題を解決できますが、私が試したものは何も機能していないようです。

さらに苛立たしいのは、これと同じコードをWebベースのGoogle関数エディターの「インラインエディター」に配置してもエラーが発生しないことです。このエラーは、リポジトリからコードをロードするときにのみ発生します。

リポジトリ内の現在のファイル構造は次のようになります。

_.
├── package
|   ├── main.py
|   ├── script1.py
|   └── script2.py
├── package2
├── ...
└── requirements.txt
_

this SO Question )で発生した問題のため、main.pyをパッケージ内に移動しました

このインポートエラーを解決する方法についてのアイデアはありますか?

4
Jed

main.pyファイルとrequirements.txtファイルは同じディレクトリにある必要があり、これも関数のデプロイ元のディレクトリと同じである必要があります。

また、 google-cloud パッケージは非推奨であり、他のgoogle-cloud-*パッケージと一緒に使用しないでください。 requirements.txtファイルから削除する必要があります。

3
Dustin Ingram

google-cloudライブラリをインストールするには、以下を実行する必要があります

pip install google-cloud-storage

google Cloudの公式ドキュメントに記載されているように、google-cloud-pubsubをインストールしないでください。

それでも、次のようにpubsubパッケージをインポートします。

from google.cloud import pubsub_v1

繰り返しになりますが、pubsub_v1ライブラリ専用のページがGoogle Cloudの公式ドキュメントにあります ここ 次の例を示しています。

import time

from google.cloud import pubsub_v1

# TODO project_id = "Your Google Cloud Project ID"
# TODO subscription_name = "Your Pub/Sub subscription name"

subscriber = pubsub_v1.SubscriberClient()
# The `subscription_path` method creates a fully qualified identifier
# in the form `projects/{project_id}/subscriptions/{subscription_name}`
subscription_path = subscriber.subscription_path(
    project_id, subscription_name)

def callback(message):
    print('Received message: {}'.format(message))
    message.ack()

subscriber.subscribe(subscription_path, callback=callback)

# The subscriber is non-blocking. We must keep the main thread from
# exiting to allow it to process messages asynchronously in the background.
print('Listening for messages on {}'.format(subscription_path))
while True:
    time.sleep(60)
0
Agile Bean