setuptools entry_point: указать на исполняемый модуль / пакет? - PullRequest
0 голосов
/ 12 апреля 2019

В файле setup.py возможно ли указать entry_points (который создает вещи в .../bin) на исполняемый модуль или пакет? То есть, если у меня есть следующие настройки:

foo/
  __init__.py
  __main__.py

Я могу сделать python3 -m foo, и Python выполнит пакет. (Это удобно, поскольку позволяет относительному импорту работать.)

В сценарии setup.py я могу добавить двоичные файлы в .../bin w / что-то вроде

entry_points={
    'console_scripts': ['foo=foo.bar:func'],
},

, которая выполняет функцию foo.bar.func() (при условии, что она существует); возможно ли сделать что-то похожее на python3 -m foo? Или это сложно делать только функции?

(Конечно, я могу переместить весь свой код в функцию с именем main() ¹, и foo.__main__:main, кажется, работает. Это просто похоже на этот аспект setuptools и -m аспект Python 3 действительно должны работать вместе, но AFAICT, правда нет? Это просто пример того, как отдельные вещи не очень хорошо работают?)

h Который я обычно делаю в любом случае, как будто это хорошая практика.

1 Ответ

0 голосов
/ 12 апреля 2019

Для явного выполнения эквивалента -m из кода Python взгляните на runpy.run_module(). Вы делаете скрипт с этим кодом и помещаете его в scripts.

В качестве альтернативы (и, возможно, предпочтительно), вы помещаете «код запуска», который запускается на -m, в функцию, а затем регистрируете эту функцию в качестве точки входа:

def main():
    <...>

if __name__ == '__main__.py':
    main()
...