Comment un paquet Debian peut-il installer des modules Python depuis PyPI

20

Cette question tente de compléter celle-ci . J'ai une application python qui utilise des modules tiers de PyPI. Je veux empaqueter mon application dans un paquet Debian, mais je ne sais pas comment gérer les dépendances Python qui ne sont pas dans les référentiels Debian / Ubuntu (également emballées comme des paquets Debian)

Solution n ° 1:
créez les modules de PyPI directement dans mon paquet Debian.

Solution n ° 2:
créer des paquets Debian pour tous les modules PyPI dont j'ai besoin en utilisant stdeb et les ajouter aux référentiels debian / ubuntu.

J'ai en fait besoin d'une Solution # 3 car je veux installer les dépendances PyPI lorsque j'installe mon paquet debian, de préférence dans un virtualenv!

Quelle serait la solution n ° 3 ? Dois-je modifier le script de maintenance DEBIAN / preinst ?

andri_ch
la source
Pouvez-vous décrire pourquoi vous devez créer un paquet Debian? Votre application Python a-t-elle besoin de ressources non Python?
Jonathan
@Jonathan Je veux que les utilisateurs puissent installer mon application depuis Ubuntu Software Center. Je pense que j'ai besoin d'un * .deb pour cela. Mon application Python n'a pas besoin de ressources non Python, juste des modules tiers Python.
andri_ch
Les packages @Jonathan Debian sont la méthode d'installation standard dans Ubuntu. On peut facilement distribuer un .debfichier, ou configurer un référentiel privé, ou un PPA dans Launchpad.
MestreLion

Réponses:

20

J'ai parlé à quelques responsables du canal Debian IRC irc: //irc.debian.org#debian-mentors , demandant exactement la même chose, et le consensus général était:

Solution n ° 1:

L'intégration des dépendances dans votre package en copiant leurs fichiers source comme une base de code unique est très mal vue. Cela irait à l'encontre de l'objectif d'un système d'emballage qui gère les dépendances, les mises à jour, la gestion des versions, etc.

Solution n ° 3:

Le téléchargement à la volée de paquets non Debian lors de l'installation d'un binaire ( .deb) est un sérieux risque de sécurité, certainement un non-non. Vous ne pourriez même pas inspecter les dépendances en extrayant le deb, car elles sont téléchargées et installées au moment de l'installation. C'est une approche qui contourne complètement le système des référentiels. Aucun utilisateur concerné ne serait satisfait d'un package qui, en coulisse (et comme root, rappelez-vous!), Télécharge des logiciels non fiables supplémentaires à partir de sources non fiables. Oui, cela nécessiterait de jouer avec DEBIAN/postinst(ou preinst) et d'émettre un wget(ou, dans votre cas,pip install), et c'est l'approche adoptée par Flash, Oracle Java, Steam et autres. Mais il s'agit d'un logiciel propriétaire et fermé, leur sécurité n'est donc pas de toute façon.

Solution # 1.5:

Vous ne l' avez pas mentionné, mais vous pouvez intégrer les dépendances uniquement au moment de la construction , par exemple, dans la source de paquet (la .orig.tar.gz, .debian.tar.gz, .dsctriade), par téléchargement à partir PyPI lors de la création du paquet « binaire » (le .deb). Les instructions pour le pip installentreraient dans debian/rules(notez les minuscules debian, par opposition au paquet binaire), et seraient exécutées lorsque vous émettez debuildou dpkg-buildpackage.

Il s'agit d'un juste milieu entre # 1 et # 3. Il atténue (mais ne résout pas!) Certains des problèmes du n ° 3: au moins, vous pouvez inspecter le produit final et .debne nécessiterait pas d'accès Internet au moment de l'installation. Tous les risques et charges sont transférés de l'utilisateur final au responsable de l'emballage. Mais, a les mêmes problèmes que # 1, car il contourne la plupart de l'infrastructure du système d'emballage. Après tout, la gestion des dépendances (versions, mises à jour, exigences, conflits) est la raison pour laquelle dpkg/ a aptété créé en premier lieu! :)

Solution n ° 2:

The One True Right Way ™ . Vous créez des packages Debian pour vos dépendances, les listez comme exigences dans votre package et expédiez tous les .debspackages source.

De là, vous avez un certain nombre d'options:

  • Soumettez les paquets source, à la fois votre logiciel et ses dépendances, pour inclusion dans Debian. S'ils étaient acceptés, ils seraient automatiquement disponibles pour tous les utilisateurs de Debian, y compris tous les dérivés comme Ubuntu.

  • Téléchargez les packages source sur Launchpad , créant ainsi un PPA que tout utilisateur d'Ubuntu (et ses dérivés comme Linux Mint) pourrait facilement ajouter et installer

  • Hébergez votre propre référentiel Debian sur votre site Web, que les utilisateurs de n'importe quel système basé sur Debian pourraient ajouter à leur /etc/apt/sources.list.det utiliser l' aptinfrastructure pour télécharger, installer et maintenir à jour (comme ci-dessus!)

  • Hébergez les .debfichiers pour téléchargement direct et installation. Aucune aptmise à jour ou mise à jour automatique impliquait une réflexion.

Quant à la façon de conditionner vos dépendances PyPi (et votre logiciel python aussi!), Il existe un certain nombre d'outils et de références qui facilitent le processus:

  • stdeb , comme vous l'avez mentionné. Oldie et goodie.

  • Pybuild , un nouvel outil incroyable de Debian qui remplace stdeb.

Et de nombreuses références utiles:

Besoin d'aide? Découvrez-les:

MestreLion
la source
2

Je pense que vous avez juste besoin d'ajouter le code de ligne de commande approprié au script postinst dans le package .deb. Trouvé dans cette réponse , plus de détails sur le guide Debian officiel .

TheSchwa
la source
2

Il faut pypi2debobtenir un paquet de pypi et en faire un paquet deb.

LtWorf
la source
0

Ce n'est pas le cas, c'est comme cpan en perl, si vous en avez dans les référentiels, vous pouvez installer avec apt-get, sinon vous pouvez installer avec pip, la différence devrait être que pip installe dans / usr / local.

Pour installer avec pip, vous pouvez faire:

apt-get install python-pip 
pip install foopackage 

par exemple:

pip install MultipartPostHandler2
Sérgio
la source
Cela ne répond pas à la question du PO. La question est de savoir comment avoir un paquet Debian installer un paquet Python à partir de PyPi afin qu'un 'apt-get <custom-package>' ou 'dpkg -i <custom-package>' puisse extraire les dépendances python de PyPi.
SevakPrime
Ce n'est pas le cas, c'est comme cpan en perl, si vous en avez dans les référentiels, vous pouvez installer avec apt-get, sinon vous pouvez installer avec pip, la différence devrait être que pip s'installe dans / usr / local, mais peut-être mieux vaut supprimer ma réponse.
Sérgio
Votre commentaire fournit une réponse appropriée à la question du PO. Vous devriez mettre ce commentaire dans votre réponse pour être voté. (Par exemple, voir la réponse de MestreLion.) En l'état, votre réponse ne répond pas à la question du PO.
SevakPrime