2010-01-09 5 views
0

У меня есть простое приложение, питона, где моя структура каталогов выглядит следующим образом:Распространение приложения питона

  • проект/
    • main.py
    • config.py
    • плагинов/
      • плагин1
      • плагин2
      • ...

Config.py только загружает файлы конфигурации, она не содержит никакой информации о конфигурации в себе.

Теперь я хочу распространять эту программу, и я думал, что буду использовать setuptools для этого. Предполагается, что пользователи файлов будут использовать main.py, так что один из них явно войдет в/usr/bin, а остальные файлы войдут в/usr/share/project.

Но есть одна проблема: мне как-то нужно сказать main.py, чтобы найти config.py в каталоге общего доступа. Но я не могу быть уверен, где именно находится папка share, поскольку это зависит от настроек setuptools, не так ли?

Какова наилучшая практика при распространении приложений на базе Python?

ответ

11

Setuptools установить пакет в месте, которое является доступным из питона, т.е. вы можете импортировать:

import project 

проблема рейз, когда вы делаете относительно импорта вместо абсолютного импорта. если ваш main.py импорт config.py работает, потому что они живут в том же каталоге. когда вы переместите свой main.py в другое место, например /usr/bin, или в другом месте, расположенном в PATH переменная окружения, python попробуйте импортировать config.py из sys.path, а не из вашего пакета. решение использовать абсолютный импорт:

from project import config 

Теперь main.py является «подвижным».

Другое решение, которое я предпочитаю, использует автоматическое создание сценариев, предлагаемое setuptools.

вместо того, чтобы ваш код в

if __name__ == "__main__": 
    # here all your beautiful code 

заявление, поставить свой код в функции (основной может быть хорошее имя):

def main(): 
    # put your code here 

if __name__ == "__main__": # not needed, just in case... 
    main() 

теперь модифицируют ваш setup.py:

setup(
    # ... 
    entry_points = { 
     "console_scripts": [ 
      # modify script_name with the name you want use from shell 
      # $ script_name [params] 
      "script_name = project.main:main", 
     ], 
    } 
) 

это все.после установки setuptools создаст скрипт-оболочку, вызываемый оболочкой и вызывающий вашу основную функцию. теперь main.py может жить в вашем каталоге проектов, и вам больше не нужно переместить его в каталог bin/. обратите внимание, что setuptools автоматически помещает этот скрипт в каталог bin/ относительно префикса установки.

es.

python setup.py install --prefix ~/.local 

установить пакет проекта в

~/.local/lib/python<version>/site-packages/<package_name> 

и ваш скрипт в

~/.local/bin/<script_name> 

поэтому убедитесь, что ~/.local/bin присутствует в вашем PATH окр. более

Информация на сайте: http://peak.telecommunity.com/DevCenter/setuptools#automatic-script-creation

+0

Я предполагаю, что я глуп, но я не вижу, как это имеет отношение? Не могли бы вы уточнить? – pafcu

+0

Я думаю, что неправильно понял ваш вопрос. вам нужно импортировать '/ usr/share/config.py'? это не является хорошим способом позволить пользователю настроить поведение вашего приложения. лучшим решением является файл конфигурации пользователя, например '$ HOME/.projectrc', возможно, глобальная конфигурация в'/etc/'. если это ваша проблема, я исправлю свой ответ. –

+0

Да, проблема заключается в импорте config.py. И в вопросе я специально говорю, что он не содержит никакой информации о конфигурации, он содержит только реализацию для загрузки фактических файлов конфигурации. Это часть программы, а не файл конфигурации или плагин. Если честно, я не полностью понимаю вещь entry_points. Это вполне может быть то, что я ищу, но я считаю, что документация немного запутанна. – pafcu

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