Облачная функция Google - ошибка загрузки функции: файл main.py, который должен определять функцию, не существует

Я пытаюсь реализовать функцию Google Cloud, основанную на коде в репозитории в стиле Git. У меня есть код, связанный с «Исходными репозиториями» Google Cloud Platform, и моя функция работает нормально, когда я копирую и вставляю код во «Встроенный редактор» функции GCP. Когда я переключаюсь на опцию «Облачный репозиторий», я могу сказать, что он читает из этого репозитория; Я работал над другими ошибками до этой. Однако после решения предыдущих / других проблем теперь я получаю эту ошибку:

Function load error: File main.py that is expected to define function doesn't exist

мои файлы имеют структуру, аналогичную этой, с main.py в корневом каталоге:

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

Он нормально читается с requirements.txt (некоторые из предыдущих ошибок возникли в результате этого процесса чтения), но почему он не читает с main.py? Моя настройка в функции GCP выглядит так:

Скриншот окна редактирования функции Google Cloud

Я попытался переместить main.py в другой каталог в проекте и установить «Каталог с исходным кодом» в этот каталог, но это дало мне ошибку, в которой говорилось, что он не может найти этот каталог. Есть конструктивные идеи?

Редактировать / Дополнительная информация

Я использую ветку из своего репозитория, отличную от master, и использую триггер темы Google Cloud Pubsub для этой функции.


person Jed    schedule 20.09.2018    source источник
comment
Все выглядит правильно. Как вы развертываете эту функцию после внесения изменений?   -  person Dustin Ingram    schedule 20.09.2018
comment
Я нажимаю на Bitbucket, и он синхронизируется с исходными репозиториями Google. Я убедился, что синхронизация происходит очень быстро (~ 1-2 секунды). Я только что обновил страницу репозиториев исходного кода Google, чтобы убедиться ... Все еще не работает.   -  person Jed    schedule 20.09.2018


Ответы (5)


Вы повторно развертываете функцию после добавления новых коммитов? Вам нужно будет сделать что-то вроде:

gcloud functions deploy NAME \
  --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/master/paths/SOURCE \
  TRIGGER

См. https://cloud.google.com/functions/docs/deploying/repo для более подробной информации.

person Dustin Ingram    schedule 20.09.2018
comment
По какой-то причине перемещение main.py в папку PACKAGE с последующим использованием следующей команды сработало, а другие параметры - нет: gcloud functions deploy NAME --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/BRANCH_NAME/paths/PACKAGE/ --trigger-topic TOPIC - person Jed; 22.09.2018
comment
Есть идеи, почему мне не удалось успешно настроить эту функцию с помощью графического веб-интерфейса для функций GCP? - person Jed; 22.09.2018

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

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

НЕ создавайте Zip-файл из CodeFolder.

Вместо этого создайте zip-файл из main.py, requirement.txt и package.

Источник

person MetalloyD    schedule 28.05.2019
comment
Вместо этого создайте zip-файл из main.py и require.txt и package. - Престижность! - person Ayyappa; 16.09.2020

Делает ли ваша облачная функция что-нибудь, прежде чем достигнет назначенной вами функции точки входа? Если произойдут какие-либо необработанные исключения, GCF не достигнет функции точки входа и выдаст эту ошибку. Например:

class SomeClass:
    def __init__(self):
        raise ValueError

err = SomeClass()

def main(event, context):
    pass

Вызовет ту же ошибку: Function load error: File main.py that is expected to define function doesn't exist. Это потому, что ваша функция точки входа никогда не достигается. Просмотрите код, который выполняется, прежде чем ваша функция будет определена, и вы, вероятно, обнаружите что-то неладное.

person Igor Carrasco    schedule 26.05.2020

У меня была похожая (возможно такая же?) Проблема. Со мной произошло то, что все мои файлы были в формате:

  1. [имя zip-файла] /main.py
  2. [имя zip-файла / [и т. д.]

и ошибка продолжала говорить, что он не может найти main. Я предполагал, что это потому, что у него была родительская папка. Немного посмотрев на вставку в родительский элемент, я решил, что проблема не в этом.

Я загрузил zip-архив и посмотрел на автоматически сгенерированный код облачной функции диалогового потока и заметил, что у них есть файл «package.json». Вместо этого у меня был только файл «requirements.txt». Я скопировал файл package.json в свой исходный код, отредактировал его для правильного содержания, заархивировал, и облачная функция скомпилирована правильно.

package.json выглядит так:

{
  "name": "test",
  "description": "testingThings",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "ABCDEFG",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:test",
    "deploy": "firebase deploy --only functions:test"
  },
  "dependencies": {
    "google-cloud-storage": "",
    "google-cloud-firestore": "",
  }
}

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

person Community    schedule 04.06.2019

Если, несмотря на другие ответы, вы по-прежнему не можете заставить его работать, я, наконец, избавился от этой ошибки, выполнив следующие действия:

  • убедитесь, что ваши пути к файлам верны (особенно файлы json, если вы загружаете из них свои учетные данные, следите за относительными путями)
  • проверьте файл requirements.txt: я использовал pipreqs для его автоматической генерации, но он допустил некоторые ошибки (например, "_" вместо "-" для таких модулей, как google-cloud-tasks). Я бы рекомендовал написать файл requirements.txt самостоятельно на основе вашего импорта.

Надеюсь, это поможет.

person garys    schedule 12.01.2020