Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Meilleure façon pour créer une distribution windows de son propre package python?

0 votes

Salut, je vais essayer d'être le plus clair possible vu que c'est mon tout premier post.

Ma question est posée dans le cadre de mon stage où, suite au développement d'un projet python, je dois pouvoir le distribuer sous plusieures plateformes, à savoir Fedora, Ubuntu ainsi que Windows

Pour faire ceci j'ai utilisé setuptools (principalement un fichier setup.py et setup.cfg) ainsi que quelques scripts .sh assez simples capables d'installer mon produit sous un format rpm généré par la commande:

python3 setup.py bdist_rpm

Cela marche très bien lorsque je le distribue sur fedora ( ce qui semble assez normal fedora connait bien les .rpm) et sur ubuntu (ça marche également mais il faut passer par alien qui convertit les .rpm en .deb). Les scripts permettent seulement d'installer les modules python dont mon package a besoin comme SQLAlchemy, Coloredlogs etc. en utilisant pip

La création de la distribution .rpm de mon projet a été réalisé sous une fedora 23 avec python3.5.

Mon problème maintenant vient lorsque j'essaye de créer un installeur sous windows.

Je travaille sous un environnement windows 10 x86_64, et j'ai également python3.5 32bits et python3.5 64 bits d'installées.

Générer un .exe de mon projet en utilisat la commande : python3 setup.py bdist_wininst me génère avec succès un .exe qu'on va appeller monprojet-1.0.0.win-amd64.exe.

Lorsque j'essaye de le mettre sur une autre machine ou même l'installer sur ma propre machine j'obtiens le message d'erreur suivant : " python version -32 is required, which was not found in the registry". Je rappelle que j'ai python3.5 32bits d'installé.

J'ai suivi ce problème sur stack overflow et j'ai pu tomber sur ce post Stack Overflow . Malheureusement ceci ne résout pas mon problème de registre.

Je me suis ensuite penché sur d'autres solutions comme par exemple : bdist_msi qui lui fonctionne bien, il installe mon package sur un autre environnement windows mais n'installe ni les libraries dont a besoin mon projet ainsi que les modules python.

J'ai également essayé d'utiliser cx_freeze et pyinstaller , mais ils ne correspondent pas à ce que je souhaite. Je veux distribuer mon projet sous forme d'un install pas juste filer un .exe qui lancera mon projet.

Mon but sera de créer mon installeur sur ma machine hôté, le donner à une machine client sur laquelle elle installe mon projet ainsi que les dépendances dont elle a besoin (mariadb, lxml etc.) et les modules python nécessaires pour mon package (SQLAlchemy). Pour lancer mon projet sur la machine client , je vais créer une commande dans le PATH utilisateur tel que lorsqu'il tapera la commande monprojet cela sera un alias de

python /chemin_monprojet/monprojet.py.

Ma question est, comment faire pour que mon bdistmsi installe également les dépendances dont j'ai besoin sur la machine client?
Ou comment faire marcher le bdist
wininst avec ce problème de registre.

Mon dernier recours serait d'essayer la solution proposé sur ce site, mais j'aimerais bien utiliser setuptools pour créer une distribution de mon projet pour toutes les OS.

demandé 19-Aou-2016 par cosmy05 (104 points)
edité 20-Aou-2016 par foxmask

Tout à fait j'essaye de distribuer mon projet en utilisant cx_freeze actuellement.

Cependant pour l'instant je rencontre des soucis avec cx_freeze qui ne trouve ni tous mes fichiers .py, ni tous les modules pythons utilisés , je dois les inclure tous manuellement.

Une fois que je résoudrais ce problème cx_freeze restera une solution satisfaisante à mon problème.

Merci

2 Réponses

+1 vote

py2exe est une extension de disutils qui permet de transformer un package en appli windows :
http://www.py2exe.org/

répondu 20-Aou-2016 par frague (536 points)

J'ai fait l'erreur d'oublier de mentionner que parmi cx_freeze et pyinstaller je me suis également penché sur py2exe.

De plus, sauf erreur de ma part, py2exe n'est pas compatible avec python 3.5.

Mais cela n'empêche que ceci ne satisfait pas mon but, moi je souhaite créer un installeur qui va installer mon programme sur la machine client, puis résoudre mes problèmes de dépendances . Le programme sera executé ensuite à partir de l'invite de commande en faisaint

python /chemin_projet/monprojet.py

Je ne veux pas filer juste un .exe et puis basta

0 votes

J'ai du mal à comprendre pourquoi s'embêter avec des exe et des rpm,
et encore moins pourquoi utiliser des scripts pour appeler pip.

Pip est justement là pour gérer tout ça : le packaging python, même si c'est parfois une plaie, est multiplateforme (incluant windows) et fonctionne bien. Un programme bien packagé s'enregiste et s'upload sur pypi en deux commandes,
et s'installe n'importe où en une commande. Couplé avec un environnement virtuel, l'installation prend trois commandes qui sont indépendantes de l'os.

Concernant les dépendances, dans le setup.py peuvent être définies des dépendances, par exemple ici docopt et matplotlib:

 setup(
     ...
     install_requires = ['docopt==0.6.4', 'matplotlib']
     ...
 )
répondu 24-Aou-2016 par lucas (2,250 points)

J'ai du mal à comprendre pourquoi s'embêter avec des exe et des rpm,
et encore moins pourquoi utiliser des scripts pour appeler pip.

Pour l'instant avec setuptools j'arrive à distribuer mon produit sur des machines fedora et ubuntu de manière satisfaisante et fonctionnelle même si ce n'est pas optimal, je le conçois.

Votre solution de le distribuer avec le packaging pip résoudrait toutes mes problèmes de dépendances et multi-platformes si je pouvais le distribuer sous forme de package privé. Je ne peux pas me permettre d'uploader un projet industriel sur un repos public.

Concernant l'option;
install_requires = ['docopt==0.6.4', 'matplotlib']

Ceci fait bel et bien parti de mon fichier setup.py.

C'est d'ailleurs grâce à cela que j'arrive à résoudre les dépendances sous ubuntu et fedora en utilisant dnf install et apt-get install. Mais sous windows je fais comment pour résoudre ces dépendances ?

Une solution que je vois serais la mise en place d'un pypi privé.

Mais sous windows je fais comment pour résoudre ces dépendances ?

pip gère cela, même sous windows, AFAIK:

 pip install package  # marche sous windows (nécessite pip)
...