Google Cloud Function-ImportError:无法从“ google.cloud”(未知位置)导入名称“ pubsub”

时间:2018-09-21 23:52:36

标签: python git google-cloud-functions importerror google-cloud-pubsub

我正在部署一个Google Cloud Function,它将使用google.cloud.pubsub_v1启动其他Google Cloud Functions,并且出现此错误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存储库中部署此代码。我已通读this SO post关于我的错误的信息,但该问题似乎与客户端应用程序中出现的错误有关。我的错误是在部署过程中由Google Cloud函数本身生成的。我对Google用于运行我的流程的自动创建的VM没有sudo权限,对吗?我应该能够从requirements.txt文件中解决此问题,但是我尝试过的任何工作似乎都没有效果。

更令人沮丧的是,当我将相同的代码放在基于Web的Google Function编辑器的“ Inline编辑器”中时,没有出现错误。从存储库加载代码时,只会出现此错误。

存储库中的当前文件结构如下所示:

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

由于this SO Question中的问题,我将main.py移到了软件包中

关于如何解决此导入错误的任何想法?

2 个答案:

答案 0 :(得分:2)

您的main.py文件和requirements.txt文件应位于同一目录中,并且该目录也应与您从中部署功能的目录相同。

此外,google-cloud软件包已被弃用,不应与其他google-cloud-*软件包一起使用。您应该将其从requirements.txt文件中删除。

答案 1 :(得分:0)

要安装google-cloud库,您需要执行

pip install google-cloud-storage

可以在Google Cloud的官方文档中看到,所以请不要安装google-cloud-pubsub

尽管如此,您仍然可以导入pubsub包

from google.cloud import pubsub_v1

同样,Google Cloud官方文档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)