9


2

Как изменить sys.path в Google App Engine (Python)?

Я попытался добавить следующую строку в мой скрипт обработчика (main.py), но, похоже, он не работает:

_ sys.path.append ( 'подкаталог') _

subdir живет в моей корневой директории (т.е. тот, который содержит app.yaml).

Это, похоже, не работает, потому что когда я пытаюсь импортировать модули, которые живут в subdir, мое приложение взрывается.

2 Answer


19


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` перед всеми остальными импортами. Link для тестируемого приложения, использующего эту технику.

И да, файл init . Py необходим; согласно documentation:

_ _ При импорте пакета Python просматривает каталоги в sys.path в поисках подкаталога пакета.

Файлы init . Py необходимы, чтобы Python рассматривал каталоги как содержащие пакеты; это сделано для предотвращения непреднамеренного скрытия действительными модулями каталогов с общим именем, например, строки, которые появляются позже в пути поиска модулей. В простейшем случае init . Py может быть просто пустым файлом, но он также может выполнить код инициализации для пакета или установить переменную` all`, как описано ниже. _ _


2


Это сработало для меня, вставив новые каталоги в качестве первых записей в sys.path.

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'))

app.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)