Импорт пакета Python из script с тем же именем

Я пытаюсь реорганизовать проект Python, переместив скрипты из каталога пакетов в каталог верхнего уровня script. После этих изменений это выглядит так, как выглядит моя иерархия проектов:

MyProject/
    setup.py

    scripts/
        my_package.py

    my_package/
        __init__.py
        module_foo.py

Обратите внимание, что script и пакет имеют одинаковое имя.

script my_package.py выглядит примерно так:

# MyProject/scripts/my_package.py
import os
try:
    import my_package
    print os.path.abspath(my_package.__file__)
except ImportError as e:
    print e

При запуске выше script интерпретатор импортирует текущий модуль, а не пакет с тем же именем (обратите внимание: пакет my_package уже был установлен в site-packages как яйцо, и наша виртуальная среда правильно активируется.)

Как я могу импортировать пакет my_package из script my_package.py, если у них есть одно и то же имя?

Другая техническая информация:

  • Python 2.7.3
  • Сервер Ubuntu 12.04 LTS
  • VirtualEnv 1.11.6

Ответ 1

Для меня это работает с

sys.path.insert(0, '..')

так как импорт делает что-то вроде for path in sys.path:.

Ответ 2

Вероятно, вы захотите переименовать my_package.py, используя каноническое имя для ядра script для модуля: __main__.py и поместите его обратно в каталог вашего модуля. Затем также организуйте автоматическое создание исполняемого файла my_package путем определения entry_point для него в файле setup.py. Python Apps на правильном пути: точки входа и скрипты, Chris Warrick покрывают это на некоторой глубине.

См. также Что такое main.py? - Переполнение стека, чтобы увидеть некоторые другие способы вызова my_package, которые также автоматически настраиваются, например python -m my_package.