Buildout: использовать «пакет» в качестве точки входа? - PullRequest
1 голос
/ 04 мая 2011

У меня есть каталог с именем ./foo в моем проекте, который содержит файл __init__.py, который содержит метод с именем main().

Я бы хотел использовать buildout для создания исполняемого файла, который будет выполнять метод main() (например: ./bin/foo). Я достиг чего-то похожего на «верхнем уровне» моей структуры каталогов, используя следующий раздел buildout.cfg:

[bar]
recipe = zc.recipe.egg
eggs = ${buildout:eggs}
entry-points = bar=bar:main

Это прекрасно работает для моего ./bar.py файла, создавая исполняемый файл ./bin/bar. Я просто не могу заставить его работать на файл ./foo/__init__.py.

Как я мог достичь вышеупомянутого?

1 Ответ

1 голос
/ 04 мая 2011

Обычно python находит модули и пакеты через путь python, через переменную sys.path. Когда buildout создает сценарии в каталоге bin/, он добавляется к переменной sys.path, перечисляя все яйца для данной части.

Чтобы python мог найти ваш модуль ./bar.py или ваш пакет ./foo, текущему каталогу также необходима часть пути к python. Я нахожу очень удивительным, что модуль bar.py найден для bin/bar, а пакет ./foo не найден; ясно, что пути Python для обеих частей разные. Вы можете просмотреть верхнюю часть сгенерированных сценариев bin/bar и bin/foo, чтобы увидеть, какие пути были добавлены в sys.path.

В любом случае вы можете вручную добавить дополнительные пути к sys.path с помощью опции extra-paths в части zc.recipe.egg. Любой путь, указанный там, будет в конечном итоге создан в вашем скрипте. Достаточно просто установить ${buildout:directory}:

[foo]
recipe = zc.recipe.egg
eggs = ${buildout:eggs}
extra-paths = ${buildout:directory}
entry-points = foo=foo:main
...