Общее соглашение для библиотек Python, которые также имеют интерфейсный модуль? - PullRequest
0 голосов
/ 18 октября 2010

Прямо сейчас у меня есть проект, который имеет следующий макет:

foo/
  __init__.py
  __main__.py
  foo.py

В этом случае foo.py на самом деле является основным файлом API, поэтому разработчики должны делать «из foo import foo», но я также хотел сделать так, чтобы конечные пользователи могли просто запустить ~$ foo и получить интерфейс.

, который, когда я делаю установку distutils, создает /usr/bin/__main__.py, потому что (a) я не знаю, как использовать distutils, [менее важно] и (b) я не уверен в том, что обычно считается Правильно.

Насколько я могу судить, у меня есть три варианта:

  1. Сделайте distutils умнее, чтобы setup.py install создал символическая ссылка /usr/bin/foo -> $PYTHONLIB/foo/__main__.py. Это мое немедленная интуиция, и я, вероятно, мог бы понять, как это сделать, хотя вещи, о которых я думаю, чувствуют себя как хаки и я не нашел никого, кто бы говорил об этом.

  2. Переименуйте __main__.py до foo перед распространением и измените вызов на настройка distutils на setup(scripts=['foo'], ...). Это очень похоже на (1), за исключением случаев, когда это происходит, я думаю.

  3. Только не включайте интерфейс с библиотечным пакетом. я чувствую как это зависит в основном от размера библиотеки / интерфейса, как имеет ли это смысл.

Я не видел очень много пакетов, которые включают __main__.py, если таковые имеются, поэтому я не уверен, что люди просто не используют их, или я не использовал правильные пакеты. Тот факт, что я не смог найти ни одного сообщения в блоге или статей, касающихся __main__.py и distutils, подсказывает мне, что это не очень популярная комбинация.

Ответы [ 2 ]

3 голосов
/ 18 октября 2010

Вызов модуля __main__.py - плохая идея, поскольку это имя имеет особое значение.Вместо этого используйте главный страж в __init__.py и создайте сценарий, который выполняет exec python -m foo.

1 голос
/ 19 октября 2010

Сочетание ответа Игнасио Васкеса-Абрамса с некоторым поиском в Интернете привело к тому, что я нашел эту статью об использовании _ main _. Py , думаю, я, вероятно, пойду макет в соответствии с:

foo/
    foo/
        __main__.py
        ...
    scripts/
        foo

, где scripts/foo - это просто

#!/bin/sh
exec python foo "$@"

Похоже, что он будет установлен чисто, и позволяют людям использовать мой модуль без установки, просто выполнив python path/to/foo.

...