Определите общие файлы для проектов GAE
У меня есть два разных проекта в учетной записи Google App Engine. Структура папок на моем компьютере выглядит следующим образом:
- parent_folder
- common_folder
- project1_folder
- project2_folder
У меня есть несколько классов Python в common_folder, которые я хочу использовать в обоих проектах (project1 и project2).
Я хочу импортировать общие классы в мои проекты, поэтому Google App Engine будет распознавать их также в Production env (возможно, GAE может создать копию общих файлов при загрузке?)
Я попытался использовать следующий код для импорта моего класса из определенного пути родительского каталога:
import os
PARENT_DIR = os.path.dirname(os.path.dirname(__file__))
print PARENT_DIR
def load_src(name, fpath):
import os, imp
return imp.load_source(name, os.path.join(os.path.dirname(__file__), fpath))
load_src("globals", PARENT_DIR +"/common/globals.py")
from globals import *
Этот код работал только из моей среды localhost, но когда я загрузил его в GAE, он не распознал класс:
> File
> "/base/data/home/apps/s~loan-management-system/1.394267205500555512/main.py",
> line 39, in load_src
> return imp.load_source(name, os.path.join(os.path.dirname(__file__), fpath)) IOError: [Errno 2] No
> such file or directory
1 ответ
Причиной ошибки, которую вы видите, является то, что ничего выше директории модуля / сервиса (или директории приложения для приложений с одним модулем) не загружается в GAE во время развертывания.
Вы можете создать символическую ссылку на необходимые файлы в директориях вашего приложения, см. /questions/47429741/sovmestnoe-ispolzovanie-suschnostej-mezhdu-modulyami-app-engine/47429753#47429753. Утилита развертывания знает, что нужно перейти по символической ссылке и включить пакет общей папки в развертывание.
Я бы предложил сделать общую папку пакетом (добавить __init__.py
файл), затем продайте его внутри каждого приложения, но вместо того, чтобы копировать / устанавливать код, просто вставьте ссылку на общий каталог кода внутри lib
реж.
Тогда вам не нужно возиться с путем вручную, в вашем приложении вы просто используете классы, подобные этому (если, например, MyClass
происходит от common_folder/class.py
):
from common_folder.class import MyClass