Модули пути в Python - PullRequest
       11

Модули пути в Python

6 голосов
/ 13 апреля 2011

Я создал папку со всеми моими модулями для моего приложения GAE и внешними библиотеками, такими как Jinja2, чтобы хранить все в одном месте.У меня структура папок выглядит следующим образом:

lib\
   \utils\
         \__init__.py
   \firepython
   \jinja2
   \jsonpickle
   __init__.py
   sessions.py

Когда я пытаюсь загрузить Jinja из utils__init__.py, я получаю ошибку ImportError: No module named jinja2.environment.Когда я смотрю на инструкции по импорту Jinja2, я вижу, что они выглядят как from jinja2.loaders.Я пытаюсь изменить их на from lib.jinja2.loaders, но при импорте появляются другие ошибки.Более того, я не думаю, что хорошей практикой является изменение этих импортов во внешнем источнике библиотек, если есть более удобный и правильный способ правильного импорта модулей.Я также добавил несколько путей к PYTHONPATH, но это не решает всех проблем.Как правильно импортировать внешний пакет, который находится в другой папке, может быть с глубокой структурой?

Ответы [ 2 ]

6 голосов
/ 13 апреля 2011

Действительно, вам не нужно менять импорт во внешних библиотеках - хотя в зависимости от вашей среды, вы можете даже иметь это.

PYTHONPATH

Достаточно изменить вашу PYTHONPATH; PYTHONPATH должен содержать путь 'lib', который является абсолютным или относительным к вашему дому, например.

Тогда вы могли бы просто сделать

from jinja2 import WHATEVER

sys.path.append

Еще один способ обойтись без PYTHONPATH - использовать sys.path.append() и добавить свои пути из кода Python. Я действительно одобряю это, поскольку это также позволяет иметь пути для приложения.

использовать virtualenv

Детали будут немного длиннее, но вы должны следовать официальному документу

Эти параметры применяются к общей разработке Python, а не к специфике GAE; если он не работает на вашей машине разработки, вы должны опубликовать более подробную информацию (точный импорт, абсолютные пути, pythonpath ...).

Надлежащая структура проекта и использование appcfg.py должны вырабатывать зависимости при загрузке в Google: посмотрите на этот хороший ответ: Как управлять сторонними библиотеками Python с помощью Google App Engine? (virtualenv? pip?) и следуйте этим указаниям.

Хороший способ работы с GAE - использование директив приложения yaml. Пожалуйста, взгляните на документ для включает в себя: http://code.google.com/appengine/docs/python/config/appconfig.html#Includes

Также помните, что GAE официально поддерживает python 2.5, а поддержка 2.7 является экспериментальной

Python 2.7 теперь официально поддерживается

1 голос
/ 13 апреля 2011

Чтобы правильно импортировать модуль, вам нужно убедиться, что python знает, где его найти. Для этого для каждой внешней библиотеки добавьте свой родительский каталог в sys.path (во время выполнения) или настройте среду PYTHONPATH (перед запуском).

Например:

import sys
sys.path.append('/my/lib')

# now we can import from lib
import jsonpickle # will load /my/lib/jsonpickle/__init__.py

См. http://docs.python.org/tutorial/modules.html#the-module-search-path. чтобы понять, что делает python при вызове import.

...