2009-10-06 2 views
3

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

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

['', '/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/инициализации .pyc в локальной директории почему он не может найти другие файлы в локальном каталоге?

Приветствия

+0

У вас есть __inits__.py в подкаталогах? –

ответ

3

Вы сказали, что есть foo каталог под текущий каталог, но вы не говорите нам, существует ли foo/__init__.py (даже, возможно, пустой): если это не так, это говорит о том, что Python foo является не a упаковка. Аналогично для 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.модули ['foo'] уже определены, например? Взаимодействующая проверка функций из стандартного библиотечного модуля imp, определяющая расположение модулей от вашего имени с учетом пути, также может оказаться поучительной.

+0

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

+0

@kalium, ok, tx, пожалуйста, сообщите нам, как это происходит (если вы просто решите, комментарий здесь хватит, если нет, может быть, другой вопрос). –

0

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

Постарайтесь избавиться от Foo/бара в Зоне-пакетах

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

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

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

+0

Нет, все дело в этом. Возможность иметь foo в моем /usr/lib/python2.6/site-packages/, но также иметь возможность иметь foo в моем локальном каталоге и запускать его оттуда. Это не стандартная библиотека python. – kalium

Смежные вопросы