Импортировать модуль из родительского или дочернего каталога в 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).