В GNU / Linux стандартный способ установки программного обеспечения - через репозитории . Это то, как вы получаете автоматическое обновление и установку зависимостей, и это путь, которым вы, вероятно, должны идти.
Иногда вы можете найти «двоичные пакеты», такие как mypackage.deb
или mypackage.rpm
, которые будут установлены двойным щелчком по ним. Однако эти пакеты, как правило, представляют собой то же самое, что вы бы поместили в репозиторий, поэтому их подготовка примерно такая же, но вы потеряете вкусности, которые идут с репозиториями.
Упаковка в GNU / Linux ближе к искусству, чем к науке, поскольку каждый из основных дистрибутивов гордится разработкой собственного менеджера пакетов, и все они сильно отличаются друг от друга. Если вы находитесь под Ubuntu, и ваше программное обеспечение будет бесплатным (как в «свободе слова»), вы можете воспользоваться обширной документацией и их свободно доступными PPA [своего рода "мини-хранилища"].
Python - как вы уже обнаружили - предлагает альтернативный «менеджер пакетов», основанный на PyPI (индекс пакетов Python), но использовать его в системах * nix обычно не рекомендуется, так как пакеты, установленные через PyPI, не знают о уже существующих в вашей системе через главный менеджер пакетов, так что вы, вероятно, в конечном итоге получите дубликаты пакетов или разные версии одних и тех же пакетов.
Еще хуже с точки зрения дизайна является PyInstaller , который создает большие исполняемые файлы (позже сжатые), включая все , которое потребуется вашему программному обеспечению для запуска. Несмотря на название, PyInstaller не является установщиком. Он просто создает огромные исполняемые файлы. С их FAQ :
Несмотря на свое название (которое больше связано с его историческими корнями), PyInstaller используется для преобразования программы Python в собственную исполняемую форму, которая не требует запуска существующих установок Python. Создание программы установки полностью выходит за рамки PyInstaller.
Теперь, что касается ваших требований:
заказано в dirs
Все менеджеры пакетов будут делать это автоматически. Целевые каталоги зависят от целевой системы, хотя (то есть: вы никогда не жестко программируете местоположение каталогов ваших исходных файлов, это система, которая решает, где их хранить).
PyInstaller, конечно, не будет делать ничего подобного.
устанавливается пользователем
В системах GNU / Linux это невозможно сделать, если у пользователя нет привилегий root [независимо от того, был ли пакет извлечен из репозитория или является двоичным файлом, поскольку блокирующей частью является то, что пользователь не имеет разрешения на запись в общесистемные каталоги ]. Самое близкое, что вы можете сделать, это чтобы пользователь создал дерево каталогов в своей домашней папке (например, в ~/.local
и поместил туда ваши исходные файлы. Это работает довольно хорошо, если система уже имеет необходимые зависимости, но если ваш источник говорит зависит от C lib, который не установлен, вам не повезло.
включает в себя все необходимые библиотеки (я думаю, это единственный рабочий вариант из моих setup.py-es)
Это одна из основных функций менеджера пакетов (deb, rpm, yum ...). PyPI сможет извлекать зависимости python для вашей программы, но не сможет извлекать двоичные зависимости [поэтому, если ваша зависимость, например, является привязкой для библиотеки C, вы получите привязка, но вы должны получить в другом месте библиотеки C].
Суть в том, что упаковка твердая, и нелегкого способа обойти ее.