Импортировать модуль из родительского или дочернего каталога в Cloud Functions?

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

.
module.py
/common
     module1.py
     module2.py
/cloudfunction1
     main.py
     requirements.txt
/cloudfunction2
     main.py
     requirements.txt

Где каждый из каталогов облачной функции развернут как отдельная облачная функция.

Я хотел бы импортировать модули либо из общего каталога, либо из корня, но используя sys.path.append('..') Подход не работает. Я предполагаю, что это потому, что процесс развертывания облачной функции включает только файлы в каталоге, в котором находится main.py?

Как я могу решить это?

1 ответ

Если вам нужно изменить sys.path или иным образом импортировать "за пределы пакета верхнего уровня", это, как правило, запах Python в том, что ваш проект структурирован неправильно.

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

.
├── common
│   ├── module1.py
│   └── module2.py
├── main.py
└── requirements.txt

куда main.py содержит обе функции:

from common import module1, module2

def cloudfunction1(request):
    ...

def cloudfunction2(request):
    ...

И вы разворачиваете эти функции непосредственно по имени:

$ gcloud beta functions deploy cloudfunction1 --runtime python37 --trigger-http
$ gcloud beta functions deploy cloudfunction2 --runtime python37 --trigger-http

Или по точке входа:

$ gcloud beta functions deploy foo --runtime python37 --entry-point cloudfunction1 --trigger-http
$ gcloud beta functions deploy bar --runtime python37 --entry-point cloudfunction2 --trigger-http

Обратите внимание, что у этого есть некоторые недостатки:

  • Ваш requirements.txt файл должен содержать все зависимости для обеих функций
  • Если вы внесете изменения в common каталог, вам нужно будет повторно развернуть обе функции

Тем не менее, если ваши функции настолько связаны между собой, что они совместно используют общий код и часто требуют совместного развертывания, лучшим вариантом может быть их включение в одно приложение App Engine. (Это применимо, только если они оба используют триггеры HTTP).

Другие вопросы по тегам