Функция Google Cloud - ImportError: невозможно импортировать имя «pubsub» из «google.cloud» (неизвестное местоположение) - PullRequest
0 голосов
/ 22 сентября 2018

Я развертываю функцию Google Cloud, которая запускает другие функции Google Cloud с помощью google.cloud.pubsub_v1, и я получаю эту ошибку ImportError: cannot import name 'pubsub' from 'google.cloud' (unknown location)

Начало моего файла needs.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.Я прочитал этот пост о моей ошибке, но этот вопрос, похоже, касается этой ошибки, возникающей в клиентском приложении.Моя ошибка генерируется самой функцией Google Cloud в процессе развертывания.У меня нет прав sudo на автоматически созданную виртуальную машину, которую Google использует для запуска моего процесса, не так ли?Я должен быть в состоянии решить эту проблему из файла requirements.txt, но ничего, что я пробовал, похоже, не работает.

Еще более неприятно то, что когда я помещаю этот же код в «встроенный редактор» в веб-редакторе функций Google, я не получаю сообщение об ошибке.Я получаю эту ошибку только при загрузке кода из хранилища.

Текущая файловая структура в хранилище выглядит примерно так:

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

Я переместил main.py внутри пакета из-за проблем, с которыми я столкнулся в этого SO-вопроса

Есть идеи, как решить эту ошибку импорта?

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Чтобы установить библиотеку google-cloud, вам нужно выполнить

pip install google-cloud-storage

, как видно из официальной документации Google Cloud, поэтому не устанавливайте google-cloud-pubsub.

Тем не менее, вы импортируете пакет pubsub, как вы это сделали

from google.cloud import pubsub_v1

. Опять же, в официальной документации Google Cloud здесь есть страница, посвященная следующему примеру:1013 *

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 голосов
/ 24 сентября 2018

Ваш main.py файл и requirements.txt файл должны находиться в одном каталоге, и это также должен быть тот же каталог, из которого вы развертываете свою функцию.

Кроме того, * 1006Пакет * устарел и не должен использоваться с другими пакетами google-cloud-*.Вы должны удалить его из вашего requirements.txt файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...