Как изменить sys.path в Google App Engine (Python)? - PullRequest
9 голосов
/ 01 марта 2010

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

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

subdir живет в моем корневом каталоге (то есть в каталоге, содержащем app.yaml).

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

Ответы [ 2 ]

19 голосов
/ 01 марта 2010

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 обращаться с каталогами как содержащие пакеты; это сделано для предотвратить каталоги с общим имя, например строка, из непреднамеренно скрывая действительные модули которые происходят позже при поиске модуля дорожка. В простейшем случае __init__.py может быть просто пустым файлом, но он также может выполнять инициализацию код для пакета или установить __all__ переменная, описанная позже.

2 голосов
/ 06 июня 2011

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