Ответ 1
Для меня это работает с
sys.path.insert(0, '..')
так как импорт делает что-то вроде for path in sys.path:
.
Я пытаюсь реорганизовать проект 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
, если у них есть одно и то же имя?
Для меня это работает с
sys.path.insert(0, '..')
так как импорт делает что-то вроде for path in sys.path:
.
Вероятно, вы захотите переименовать my_package.py
, используя каноническое имя для ядра script для модуля: __main__.py
и поместите его обратно в каталог вашего модуля. Затем также организуйте автоматическое создание исполняемого файла my_package
путем определения entry_point
для него в файле setup.py
.
Python Apps на правильном пути: точки входа и скрипты, Chris Warrick покрывают это на некоторой глубине.
См. также Что такое main.py? - Переполнение стека, чтобы увидеть некоторые другие способы вызова my_package
, которые также автоматически настраиваются, например python -m my_package
.