Почему абсолютный импорт не может найти мой модуль?

У меня есть проект Python 2.7, который выглядит так:

мой проект\

- __init__.py
- __main__.py
- foo.py

Я хочу использовать абсолютный импорт, как того требует PEP 8, но когда я пытаюсь сделать это в __main__.py:

from myproject.foo import bar

С python -m myproject

Я получил:

ImportError: нет модуля с именем myproject.foo

Что я делаю неправильно?


person Sean W.    schedule 30.09.2013    source источник
comment
Что вы сделали, чтобы конкретно вызвать это исключение? python -m myproject? Если да, пожалуйста, отредактируйте свой вопрос с этой информацией   -  person Ian Stapleton Cordasco    schedule 30.09.2013
comment
да. Я отредактировал вопрос.   -  person Sean W.    schedule 30.09.2013


Ответы (2)


После небольшого поиска в Google оказывается, все Мне нужно было добавить:

from __future__ import absolute_import

Это добавляет некоторую уверенность в будущем для Python 3. Обратите внимание, что PyDev не может найти модули таким образом. Я открою отдельный вопрос для этого.

person Sean W.    schedule 30.09.2013
comment
Возможно, вы захотите упомянуть в своем вопросе, что вы используете Python 2.x (и также пометить его как таковой для актуальности) - person Wayne Werner; 30.09.2013

Чтобы это работало, myproject должен быть на вашем пути к Python. Вы можете сделать это извне, установив переменную PYTHONPATH, или внутри программы, добавив ее в sys.path.

(Обратите внимание, что нет соглашения использовать имена с двойным подчеркиванием для чего-либо, кроме __init__.py. Ваше __main__.py кажется очень странным именем.)

person Daniel Roseman    schedule 30.09.2013
comment
__main__понятен python, когда вы python -m создаете пакет. - person SingleNegationElimination; 30.09.2013
comment
Я использовал __main__.py, потому что Python ищет его, когда python myproject запущен. - person Sean W.; 30.09.2013
comment
Круто, я почему-то никогда не сталкивался с этим раньше. - person Daniel Roseman; 30.09.2013
comment
__main__.py также позволяет заархивировать проект в myproject.zip (или куда-то еще) и запустить python myproject, @DanielRoseman - person Wayne Werner; 30.09.2013
comment
@WayneWerner Спасибо! Я этого не знал! - person Sean W.; 30.09.2013