Python не может импортировать модуль из подкаталога даже с файлом с именем __init.py__ в каталоге

Я знаю, что этот вопрос задавался много раз здесь, и я, вероятно, прочитал большинство ответов (в том числе this и который), а также документацию на python, но по-прежнему не может найти ответ на мою очень простую проблему с импортом. Это так просто, что я должен пропустить что-то глупое, но пока этого не вижу. Я установил следующую структуру:

myproject
    myscript.py
    MyPackage
        __init.py__
        mymodule.py

Я просто хочу загрузить mymodule.p y из myscript.py (или интерпретатор командной строки python, который должен быть тем же).

myscript.py содержит:

#!/usr/bin/python
import MyPackage

__init.py__ содержит:

from . import mymodule

mymodule.py содержит

#!/usr/bin/python

def myfunction():
    print "mymessage"

Моя цель - вызвать myfunction из myscript.py, но если я попытаюсь вызвать модуль, я получаю

$python myscript.py 
Traceback (most recent call last):
   File "myscript.py", line 2, in <module>
   import MyPackage
ImportError: No module named MyPackage

Что я уже пробовал:

  • Я попробовал все под OSX и Ubuntu Linux, чтобы уменьшить вероятность неисправной установки python.
  • Я установил переменную среды PYTHONPATH в каталог myproject, а также в . и для обоих.
  • Я оставил __init.py__ blank
  • Я попробовал инструкции импорта также из интерпретатора python, запущенного из каталога myproject
  • Я попробовал следующие операторы импорта:

    from MyPackage import mymodule
    import MyPackage.mymodule
    import MyPackage.mymodule as module
    

    все без успеха (одно и то же сообщение об ошибке).

Если я помещаю mymodule.py в каталог проекта без использования пакета, импорт работает нормально. Но я не понимаю, почему импорт из подпакетов не работает. Любая идея, как я могу заставить это работать?

Спасибо за помощь!

Ответ 1

Во время редактирования форматирования сообщения я заметил, что вы вызываете свой файл __init.py_. Это приводит к тому, что python не распознает ваш каталог MyPackage как пакет, поэтому ImportError: No module named MyPackage.

Он должен быть __init__.py (имя __init__, расширение .py). Тогда это сработает, ваша структура проекта и операторы импорта в противном случае верны.

Один незначительный момент: вы также должны использовать стиль lower_underscore для обозначения вашего пакета. Пакеты также являются модулями в Python, и они должны следовать тем же соглашениям об именах. См. PEP8 для получения подробной информации о рекомендуемых стилях и соглашениях об именах. Это просто соглашение, но оно не имеет ничего общего с вашей проблемой.