Как изменить sys.path в Google App Engine (Python)?
-
23-09-2019 - |
Вопрос
Я попытался добавить следующую строку в мой скрипт-обработчик (main.py), но, похоже, это не работает:
sys.path.append('вложенный каталог')
subdir
находится в моем корневом каталоге (т. е.тот , который содержит app.yaml
).
Похоже, это не работает, потому что когда я пытаюсь импортировать модули, которые находятся в subdir
, мое приложение взрывается.
Решение
1) Убедитесь, что у вас есть пробел __init__.py
файл в subdir
.
2) Используйте полный путь;что - то вроде этого:
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'subdir'))
Редактировать:предоставление дополнительной информации для ответа на вопросы, заданные в комментарии.
Как демонстрирует Ник Джонсон вы можете поместить эти три строки кода в файл под названием fix_path.py
.Затем, в вашем main.py
файл, сделай это import fix_path
перед всеми другими видами импорта. Ссылка на протестированное приложение, использующее этот метод.
И, да, тот самый __init__.py
требуется файл;в соответствии с Документация:
При импорте пакета Python выполняет поиск по каталогам в sys.path в поисках пакета подкаталога.
Тот Самый
__init__.py
файлы необходимы для того, чтобы заставить Python обрабатывать каталоги как содержащие пакеты;это сделано, чтобы предотвращения каталогов с общим имя, таким как String, с невольно скрывая допустимые модули что происходит позже модуля поиска путь.В простейшем случае,__init__.py
может быть просто пустым файлом, но он также может выполнять инициализацию код для пакета или задавать__all__
переменная, описанная позже.
Другие советы
Мне помогло вставить новые каталоги в качестве первых записей в sys.path.
путь_changer.py:
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'libs'))
sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'apps'))
приложение.py:
import path_changer
from google.appengine.ext.webapp.util import run_wsgi_app
from flask import Flask
import settings
app = Flask('myapp')
app.config.from_object('settings')
from website import views as website_views
run_wsgi_app(app)