Импорт модуля с таким же именем и системным модулем - PullRequest
3 голосов
/ 18 августа 2011

Моя ситуация похожа на ситуацию в этом вопросе ... Разница в том,

В нашем проекте python / django у нас есть каталог с именем utils , в котором хранятся основные функции ...

Иногда нам нужно протестировать некоторые модули, запустив thm из консоли, например

python myproject/some_module.py

Все хорошо, пока python не попытается импортировать что-то из нашего каталога утилит ...

from utils.custom_modules import some_function
ImportError: No module named custom_modules

Я проверяю свой путь к Python, и наш проект находится в списке, каждая папка в файле проекта содержит __init__.py файлов, и когда я запускаю ipython в каталоге проекта ... Все в порядке, в противном случае python импортирует из своего собственного каталога утилит ...

Мои коллеги используют метод sama без каких-либо проблем, но он выбрасывает ImportError в моей среде ... В чем может быть проблема, что все мы отсутствовали?

ОБНОВЛЕНИЕ: В моем каталоге проекта и в каждом подкаталоге есть файл __init__.py, и я могу без проблем импортировать другие модули из моего проекта ... Когда я нахожусь в другой папке, чем мой prockt, и я запускаю ipython, с таким импортом проблем нет ...

from someothermodule.submodule imprort blahblahblah

Но, когда дело доходит до импорта утилит, он терпит неудачу ...

UPATE 2: Причиной проблемы был каталог utils в папке django , который также находится в пути python ...

Ответы [ 2 ]

6 голосов
/ 18 августа 2011

См. PEP по абсолютному и относительному импорту для семантики.Вы, вероятно, захотите

from .utils.custom_modules import some_function

, если вы находитесь в файле на верхнем уровне вашего пакета.

Редактировать: Это можно сделать только из пакета.Это по уважительной причине - если вы импортируете что-то, что является частью вашего проекта, то вы уже рассматриваете это как пакет Python, и вам действительно нужно сделать это.Вы делаете это, добавляя файл __init__.py в каталог проекта.

Редактировать 2: Вы полностью изменили вопрос.Возможно, можно обойти эту проблему, но правильное решение не относится к вашему упакованному так же, как встроенный пакет .Вам нужно либо переименовать utils, либо сделать его подпакетом другого пакета , чтобы вы могли ссылаться на него с помощью неконфликтующего имени (например, from mydjangoapp.utils.custom_modules import some_function).

0 голосов
/ 18 августа 2011

Я не собираюсь говорить вам, что вы не должны называть свои собственные модули после модулей stdlib;

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

import sys, imp

utils = sys.modules.get('utils')
if not utils: utils = imp.load_module('utils',*imp.find_module('utils/utils'))

Однако, если после переименования вам не нужно будет что-то менять, я бы посоветовал вам переименовать его.

...