Определите общие файлы для проектов 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
Другие вопросы по тегам