Я пытался написать и развернуть облачную функцию в Python.(отказался от node.js из-за грязной документации и относительно быстрого темпа изменений)
Он предназначен для публикации сообщения в теме публикации / публикации, инициируемого по завершении загрузки файла в корзину Google.("финализировать").
Код, который я использую для развертывания функции:
gcloud functions deploy hello_gcs_generic --runtime python37 --trigger-resource bucketcfpubsub
Я пытался с помощью этого сценария, предоставленного Google
import time
from google.cloud import pubsub_v1
project_id = "bucketcfpubsub"
topic_name = "projects/bucketcfpubsub/topics/pubsub"
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project_id, topic_name)
def callback(message_future):
# When timeout is unspecified, the exception method waits indefinitely.
if message_future.exception(timeout=30):
print('Publishing message on {} threw an Exception {}.'.format(
topic_name, message_future.exception()))
else:
print(message_future.result())
for n in range(1, 10):
data = u'Message number {}'.format(n)
# Data must be a bytestring
data = data.encode('utf-8')
# When you publish a message, the client returns a Future.
message_future = publisher.publish(topic_path, data=data)
message_future.add_done_callback(callback)
print('Published message IDs:')
# We must keep the main thread from exiting to allow it to process
# messages in the background.
while True:
time.sleep(60)
К которому я получаю эти ошибки в Google Cloud Console
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function load error: Code in file main.py can't be loaded.
Detailed stack trace: Traceback (most recent call last):
File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 256, in check_or_load_user_function
_function_handler.load_user_function()
File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 166, in load_user_function
spec.loader.exec_module(main)
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/user_code/main.py", line 3, in <module>
from google.cloud import pubsub_v1
ImportError: cannot import name 'pubsub_v1' from 'google.cloud' (unknown location)
Следуя инструкциям этих двух сообщений, я скопировал требования.txt из примера кода helloworld, содержащего только
google-cloud-error-reporting==0.30.0
и обновленные другие облачные функции, такие как bigquery, хранилище и ведение журнала.Затем я получил эти ошибки:
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function load error: Code in file main.py can't be loaded.
Detailed stack trace: Traceback (most recent call last):
File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 256, in check_or_load_user_function
_function_handler.load_user_function()
File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 166, in load_user_function
spec.loader.exec_module(main)
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/user_code/main.py", line 3, in <module>
from google.cloud import pubsub_v1`
, и я также нашел [эту тему] ( ImportError: не могу импортировать имя 'pubsub_v1' из 'google.cloud' (неизвестное местоположение) , но яне совсем понимаю, в чем решение, я попытался заменить pubsub_v1 на google-cloud-pubsub == 0.38.0, который не помог. Вместо этого я получаю эту ошибку:
Deploying function (may take a while - up to 2 minutes)...failed.
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function load error: Code in file main.py can't be loaded.
Detailed stack trace: Traceback (most recent call last):
File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 256, in check_or_load_user_function
_function_handler.load_user_function()
File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 166, in load_user_function
spec.loader.exec_module(main)
File "<frozen importlib._bootstrap_external>", line 724, in exec_module
File "<frozen importlib._bootstrap_external>", line 860, in get_code
File "<frozen importlib._bootstrap_external>", line 791, in source_to_code
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/user_code/main.py", line 3
Кроме того, это делаетне кажется ли это устойчивым исправлением, если код перестанет работать после того, как Google обновит pubsub до новой версии?
Так что я очень новичок и совершенно потерян, но я надеюсь, что эта документация может помочь вам, ребята, помочь мне.
ОБНОВЛЕНИЕ:
Кажется, что pubsub и pubsub_v1 допустимы для использования, хотя я не уверен, в чем разница.
@ dustin Я сделал pip install -rrequire.txt, который в итоге соответствовал тому, что вы предоставили. Я также заметил ошибку при развертывании функции как 'hello-gcs-generic', которую следует заменить на 'callback'.
Теперь код Pythonхорошо работает локально, но развертывает егов облако с помощью приведенного выше кода (первая строка кода в OP) последовательно возвращает эту ошибку
ERROR: (gcloud.functions.deploy) OperationError: code=3, messa
ge=Function load error: Error: function load attempt timed out
.