Проблема пути поиска модуля Python

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

sys.path возвращает кучу dirs, как это

['', '/usr/lib/python26.zip', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/site-packages' etc 

Это хорошо, он использует текущий каталог в качестве первого места поиска (по крайней мере, так я понимаю).

Хорошо теперь, если я создам файл с именем command.py в текущем каталоге, все работает так, как я ожидал бы.

 >>> import commands >>> commands.__file__ 'commands.pyc' 

Затем я выхожу из оболочки python и запускаю другой. Затем я делаю это.

 >>> import foo.bar.commands 

Теперь, я ожидаю, что это произойдет, – спуститесь с текущего каталога на ./foo/bar/ и получите от меня модуль команд. Я понимаю, что это

 >>> foo.bar.commands.__file__ '/usr/lib/python2.6/site-packages/foo/bar/commands.pyc' 

Хотя из моего текущего каталога есть ./foo/bar/commands.py

Используя imp.find_module () и imp.load_module (), я могу правильно загрузить локальный модуль. Что действительно интересно (хотя я действительно не знаю, что это означает), это последняя строка, напечатанная в этой последовательности

 >>> import foo.bar.commands >>> foo.bar.commands.__file__ '/usr/lib/python2.6/site-packages/foo/bar/commands.pyc' >>> foo.bar.__file__ '/usr/lib/python2.6/site-packages/foo/bar/__int__.pyc' >>> foo.__file__ './foo/__init__.pyc' 

Итак, если он может найти foo / init .pyc в локальном каталоге, почему он не может найти другие файлы в локальном каталоге?

ура

2 Solutions collect form web for “Проблема пути поиска модуля Python”

Вы упомянули, что в вашем текущем каталоге есть каталог foo , но вы не говорите нам, существует ли foo/__init__.py (даже возможно пустое): если это не так, это говорит Python, что foo не является пакетом. Аналогично для foo/bar/__init__.py – если этот файл не существует, даже если foo/__init__.py делает, то foo.bar не является пакетом.

Вы можете немного поиграть, разместив файлы .pth и / или установив __path__ явно в своих пакетах, но основное простое правило – просто поместить __init__.py в каждую директорию, которую вы хотите, чтобы Python распознал как пакет. Содержимое этого файла является «телом» самого пакета, поэтому, если вы import foo и foo , это каталог с файлом foo/__init__.py , то это то, что вы импортируете (в любом случае тело пакета выполняется в первый раз, когда вы импортируете что-либо из пакета или любой его подпакет).

Если это не проблема, похоже, какой-то другой импорт (или явная манипуляция с sys.path) может испортить вас. Запуск python с флагом -v делает импорт очень заметным, что может помочь. Еще одна хорошая техника – разместить

 import pdb; pdb.set_trace() 

непосредственно перед импортом, который, по вашему мнению, является неправильным, и рассматривая sys.path, sys.modules (и, возможно, другие расширенные структуры, такие как захват импорта) в этот момент, существует ли уже установленный sys.modules ['foo'], например ? Интерактивная попытка использования функций из стандартного библиотечного модуля imp который находит модули от вашего имени с учетом пути, также может оказаться поучительным.

Что такое foo в /usr/lib/python2.6/site-packages? Похоже, вы создали foo в своем локальном каталоге, но это не обязательно тот, который вы импортируете.

Попробуйте избавиться от foo / bar в пакетах сайтов

Убедитесь, что структура каталогов выглядит так:

 /foo/__init__.py /bar/__init__.py /commands.py 

Кроме того, неплохо не повторять использование имен стандартной библиотеки python для ваших собственных модулей – можете ли вы назвать свои команды.py что-то еще?

Interesting Posts

Получить содержимое виджета Tkinter Entry

Что такое чистый способ преобразования процентной ставки строки в float?

входные переменные, разделенные запятой в одной строке

Как применять границы max & min к значению без использования условных операторов

Как указать строки и столбцы тега <textarea> с помощью wtforms

Python 3.4: код неизвестного формата 'x'

Список всех аудиоустройств с pyaudio Python (привязка к порталу)

Получение объекта 'str' не имеет атрибута 'get' в Django

Пользовательская Colormap в Python

Разбирая пустую строку в Python, почему split () возвращает пустой список в то время как split ('\ n') возвращает ?

Подсчитайте количество строк между двумя датами BY ID в кадре данных Pandas GroupBy

Событие PyQt выдано дважды

Абсолютный импорт невозможен в подпакете, который затеняет имя пакета stdlib

Форматирование даты и времени в строку с миллисекундами

Python – получить имена процессов, процессор, использование Mem и использование пикового ввода в окнах

Python - лучший язык программирования в мире.