Что такое общий процесс / концепция, чтобы определить, что добавить в PYTHONPATH для решения проблем импорта? - PullRequest
3 голосов
/ 17 февраля 2011

У меня постоянно возникают проблемы с нерешенным импортом в моем проекте Django (в Eclipse с PyDev).После некоторого поиска в гугле по определенной проблеме я обычно могу найти правильную вещь, которую нужно добавить в PYTHONPATH, чтобы решить эту проблему.Но мне кажется, что мне не хватает какой-то концепции или процесса, с помощью которого я могу однозначно сказать: «Очевидно, я должен добавить то, что нужно, чтобы эта вещь импортировалась должным образом».Что делает это более расстраивающим, так это то, что я просто следую базовому учебнику по Django, поэтому я ожидаю, что с этими вещами просто разбираются.В мире Java это обычно довольно ясно, потому что я могу точно узнать, из какой библиотеки поступает конкретный пакет, скачать его и добавить в путь сборки.Какова эквивалентная концепция в мире Python / Django?

Я не собираюсь здесь решать какую-то конкретную проблему, а скорее хочу знать, каковы шаги, которым нужно следовать, или где их искать, или концепцию, которую япропал.Или, возможно, выяснить, что нет ни одного, и его всегда догадки ...

Я работаю на Ubuntu 10.10, Python 2.6

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Если вы используете eclipse, она может автоматически настроить интерпретатор python (включая все библиотеки, которые установлены в масштабе всей системы). Вы, вероятно, сделали этот шаг.

Если вы все еще сталкиваетесь с проблемами при импорте, вы, вероятно, не устанавливали библиотеки в масштабе всей системы. Или вы изменили пути Python и удалили каталоги по умолчанию.

Обычно есть setup.py с библиотекой python. Он установит эту библиотеку в вашу систему:

python setup.py install

Некоторые библиотеки, поставляемые с setup.py, могут быть установлены из индекса пакета Python с pip .

Если библиотека не предоставляет сценарий setup.py, вам нужно будет обработать его вручную.

Итак, основное правило для библиотек python: если вы не устанавливали их в масштабе всей системы, вам нужно вручную добавить их в python-path.

Если вы не хотите устанавливать кучу общесистемных библиотек, могут помочь такие инструменты, как virtualenv или buildout .

Virtualenv создает среду, в которой вы можете устанавливать библиотеки, как если бы вы устанавливали их глобально:

[path-to-virtualenv]/bin/python setup.py install

and your library will install to:

[path-to-virtualenv/lib/site-packages

Buildout работает немного по-другому. Вы указываете список пакетов, которые вы хотите установить в файлах конфигурации, и он будет генерировать файлы сценариев с фиксированными путями. Buildout также может генерировать параметры конфигурации для проекта pydev. Buildout - инструмент автоматизации с собственным способом создания виртуальной среды. Buildout делает больше вещей, чем virtualenv, но поначалу может быть трудно иметь дело.

1 голос
/ 18 февраля 2011

Если вы устанавливаете модули для всей системы (пакеты сайтов или аналогичные), у вас, вероятно, не возникнет проблем с их запуском в вашей системе, поэтому я собираюсь обсудить PYTHONPATH вашего проекта.

Каталог файла, который является вашим путем входа в вашу программу, добавляется в PYTHONPATH вместе со всеми определенными системой PYTHONPATHS.Чтобы получить доступ к любому сценарию в этой структуре каталогов, каждый каталог должен содержать файл с именем __init__.py, который указывает, что этот каталог является модулем в вашей программе.

/myproject/
    entrypoint.py
    apps/
        __init__.py
        app1/
            __init__.py
            models.py
            views.py
        app2/
            models.py  # unreachable
            views.py   # unreachable

Если запустить python entrypoint.py, вы будетевозможность доступа к app1, потому что все папки от entrypoint.py до app1 содержат файл __init__.py.Однако app2 не может быть импортирован, так как он не отображается как модуль.

Если у вас есть каталог, который является модулем, вы должны убедиться, что он содержит __init__.py или что /path/to/app1 находится внутри самого sys.path, который затем можно импортировать просто с помощью import models.

1 голос
/ 17 февраля 2011

Исходя из вашего вопроса, я предполагаю, что вы новичок в Python, поэтому давайте начнем с самого начала.

Мой совет - взглянуть на трассировку, которую генерирует Django, и найти строку, которая выглядит следующим образом: «ImportError: нет модуля с именем somemodule». Это говорит вам имя отсутствующего модуля.

Как только вы знаете имя модуля, вы можете попытаться увидеть, указан ли отсутствующий модуль в PyPi (индекс пакета Python), с помощью easy_install.

Попробуйте запустить:

easy_install somemodule

Если вам повезет, то отсутствующий модуль будет установлен в директорию site-packages вашей установки python (возможно, /usr/lib/python2.6/site-packages, в зависимости от того, где установлен ваш python). Каталог site-packages - это то место, куда должны быть установлены все сторонние модули, и все модули в этом каталоге всегда доступны для импорта и находятся в PYTHONPATH.

Возможно, ваш код пытается импортировать что-то, что недоступно в PyPi, и в этом случае Google - ваш лучший вариант: p

p.s. Если easy_install не работает (или отсутствует), возможно, у вас не установлен Python-модуль setuptools, который можно получить здесь: http://pypi.python.org/pypi/setuptools

...