谷歌云函数 - ImportError:无法从'google.cloud'(未知位置)导入名称'pubsub'

10

我正在部署一个Google Cloud函数,它将使用google.cloud.pubsub_v1来启动其他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>)

我正在从Google Cloud Source Repository部署此代码。我阅读了关于我的错误的这篇SO文章,但该问题似乎是关于客户端应用程序中出现的错误。我的错误是在Google Cloud函数本身在部署过程中生成的。我没有sudo权限来访问由Google用于运行我的进程的自动创建VM,对吗?我应该能够通过requirements.txt文件解决此问题,但我尝试的所有方法都不起作用。
更令人沮丧的是,当我将相同的代码放入基于Web的Google Function编辑器上的“内联编辑器”中时,我不会得到错误。只有在从存储库加载代码时才会出现此错误。
存储库中的当前文件结构如下:
.
├── package
|   ├── main.py
|   ├── script1.py
|   └── script2.py
├── package2
├── ...
└── requirements.txt

因为我遇到了这个SO问题,所以我将main.py移动到一个包内。

你有什么解决导入错误的想法吗?

2个回答

7
您的main.py文件和requirements.txt文件应该放在同一个目录中,并且这个目录也应该是您部署函数的目录。
此外,google-cloud包已经过时,不应与其他google-cloud-*包一起使用。您应该从requirements.txt文件中删除它。

无论在requirements.txt文件中是否包含google-cloud包,我都会收到相同的错误。 - Jed
我看到你正在使用云源代码库。在将新的提交推送到存储库后,你是否确保重新部署函数?它不会自动部署。 - Dustin Ingram
是的,我将代码推送到我的代码仓库,然后在终端中运行“gcloud deploy ...”命令,这就是当我部署函数时出现此错误的时候。 - Jed
我应该寻找哪些其他想法来解决这个问题? - Jed
搞定了!requirements.txt文件需要与main.py在同一个目录中。我把我的文件移动到了package目录中。你能否更新你的答案,包括这个信息,我会将其标记为解决方案? - Jed
显示剩余3条评论

0
要安装google-cloud库,您需要执行以下操作:
pip install google-cloud-storage

正如官方的Google Cloud文档所示,不要安装google-cloud-pubsub

尽管如此,您可以像以前一样导入pubsub包:

from google.cloud import pubsub_v1

另外,Google Cloud 官方文档此处还有一个专门介绍 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接