Google Cloud Function - ImportError: cannot import name 'pubsub' from 'google.cloud' (unknown location)
Google Cloud Function - ImportError: cannot import name 'pubsub' from 'google.cloud' (unknown location)
我正在部署一个 Google 云函数,它将使用 google.cloud.pubsub_v1
启动其他 Google 云函数,我收到此错误 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>)
我正在从 Google Cloud Source Repository 部署此代码。我已通读 关于我的错误,但该问题似乎与客户端应用程序中出现的错误有关。我的错误是由 Google 云函数本身在部署过程中产生的。我没有 Google 用于 运行 我的进程的自动创建的 VM 的 sudo
权限,对吗?我应该能够从 requirements.txt
文件中解决这个问题,但我尝试过的似乎都没有用。
更令人沮丧的是,当我将相同的代码放入基于网络的 Google 函数编辑器的 "Inline editor" 中时,我没有收到错误。我只在从存储库加载代码时收到此错误。
存储库中的当前文件结构如下所示:
.
├── package
| ├── main.py
| ├── script1.py
| └── script2.py
├── package2
├── ...
└── requirements.txt
由于我在
中遇到的问题,我将 main.py 移到了一个包裹中
关于如何解决此导入错误的任何想法?
您的 main.py
文件和 requirements.txt
文件应该在同一目录中,并且这也应该是您从中部署函数的同一目录。
此外,google-cloud
包已弃用,不应与其他 google-cloud-*
包一起使用。您应该将其从 requirements.txt
文件中删除。
要安装google-cloud
库,您需要执行
pip install google-cloud-storage
在官方Google云文档中可以看到,所以不要安装google-cloud-pubsub
。
尽管如此,您还是像
那样导入 pubsub 包
from google.cloud import pubsub_v1
同样,官方 Google 云文档 here 上存在一个专用于 pubsub_v1 库的页面,其中显示了以下示例:
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)
我正在部署一个 Google 云函数,它将使用 google.cloud.pubsub_v1
启动其他 Google 云函数,我收到此错误 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>)
我正在从 Google Cloud Source Repository 部署此代码。我已通读 sudo
权限,对吗?我应该能够从 requirements.txt
文件中解决这个问题,但我尝试过的似乎都没有用。
更令人沮丧的是,当我将相同的代码放入基于网络的 Google 函数编辑器的 "Inline editor" 中时,我没有收到错误。我只在从存储库加载代码时收到此错误。
存储库中的当前文件结构如下所示:
.
├── package
| ├── main.py
| ├── script1.py
| └── script2.py
├── package2
├── ...
└── requirements.txt
由于我在
关于如何解决此导入错误的任何想法?
您的 main.py
文件和 requirements.txt
文件应该在同一目录中,并且这也应该是您从中部署函数的同一目录。
此外,google-cloud
包已弃用,不应与其他 google-cloud-*
包一起使用。您应该将其从 requirements.txt
文件中删除。
要安装google-cloud
库,您需要执行
pip install google-cloud-storage
在官方Google云文档中可以看到,所以不要安装google-cloud-pubsub
。
尽管如此,您还是像
那样导入 pubsub 包from google.cloud import pubsub_v1
同样,官方 Google 云文档 here 上存在一个专用于 pubsub_v1 库的页面,其中显示了以下示例:
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)