2010-10-18 2 views
0

Прямо сейчас у меня есть проект, который имеет следующую структуру:Общее соглашение для библиотек python, которые также имеют интерфейсный модуль?

foo/ 
    __init__.py 
    __main__.py 
    foo.py 

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

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

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

  1. Make 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, говорит мне, что это не особенно популярная комбинация.

ответ

1

Объединяя ответ Ignacio Vazquez-Абрамс с некоторыми Googling, что привело меня найти this article about using _main_.py, я думаю, что я, вероятно, буду идти с компоновкой по линиям:

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

где scripts/foo просто

#!/bin/sh 
exec python foo "[email protected]" 

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

3

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

+0

Мое понимание этого в том, что если мой foo/__ init__.py имеет 'if __name__ ==" __main __ ": \ n печатать 'success.'', и я делаю' python -m foo', я должен видеть "успех «. Вместо этого я получаю: «foo - это пакет и не может выполняться напрямую». То же самое происходит, если я использую команду в скрипте. – quodlibetor

+0

Ну, это глупо. Вместо этого попробуйте 'foo .__ init__'. –

+1

Кроме того, я думал, что полагаюсь на специальные характеристики '__main __. Py'? Если нет других, я думал, что все, что он сделал, это сделать исполняемый файл как скрипт. – quodlibetor

Смежные вопросы