web-dev-qa-db-fra.com

Qu'est-ce que setup.py?

Quelqu'un peut-il expliquer, en quoi consiste setup.py et comment peut-il être configuré ou utilisé?

683

setup.py est un fichier python, qui indique généralement que le module/package que vous allez installer a été empaqueté et distribué avec Distutils, le standard de distribution des modules Python.

Cela vous permet d'installer facilement les packages Python. Souvent, il suffit d'écrire:

$ python setup.py install

et le module s’installera tout seul.

https://docs.python.org/3/installing/index.html#installing-index

469
Silfverstrom

Il est utile d’installer un paquet python foo sur votre machine (vous pouvez aussi l’être dans virtualenv) pour pouvoir importer le paquet foo à partir d’autres projets et également à partir des invites Python. 

Fait le même travail que pip, easy_install etc.,


Utilisation de setup.py 

Commençons par quelques définitions:

Package - Un dossier/répertoire contenant le fichier __init__.py.
Module - Un fichier python valide avec l'extension .py.
Distribution - Comment un package se rapporte-t-il aux autres packages et modules

Supposons que vous souhaitiez installer un package nommé foo. Alors tu fais, 

$ git clone https://github.com/user/foo  
$ cd foo
$ python setup.py install

Au lieu de cela, si vous ne voulez pas réellement l’installer mais voulez quand même l’utiliser. Alors fais, 

$ python setup.py develop  

Cette commande créera des liens symboliques vers le répertoire source au sein de site-packages au lieu de copier des éléments. De ce fait, il est assez rapide (particulièrement pour les gros paquets). 


Création de setup.py 

Si vous avez votre arbre de paquets comme, 

foo
├── foo
│   ├── data_struct.py
│   ├── __init__.py
│   └── internals.py
├── README
├── requirements.txt
└── setup.py

Ensuite, vous effectuez les opérations suivantes dans votre script setup.py afin qu’il puisse être installé sur une machine: 

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
)

Au lieu de cela, si votre arborescence de paquets est plus complexe que celle ci-dessous: 

foo
├── foo
│   ├── data_struct.py
│   ├── __init__.py
│   └── internals.py
├── README
├── requirements.txt
├── scripts
│   ├── cool
│   └── skype
└── setup.py

Alors, votre setup.py dans ce cas serait comme:

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

Ajouter plus de choses à (setup.py) et le rendre décent:

from setuptools import setup

with open("README", 'r') as f:
    long_description = f.read()

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   license="MIT",
   long_description=long_description,
   author='Man Foo',
   author_email='[email protected]',
   url="http://www.foopackage.com/",
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

Le long_description est utilisé dans pypi.org comme description README de votre paquet. 


Et enfin, vous êtes maintenant prêt à télécharger votre paquet sur PyPi.org afin que d'autres personnes puissent l'installer à l'aide de pip install yourpackage

La première étape consiste à revendiquer le nom et l’espace de votre paquet dans pypi en utilisant:

$ python setup.py register

Une fois le nom de votre colis enregistré, personne ne peut le réclamer ni l’utiliser. Après une inscription réussie, vous devez télécharger votre paquet là-bas (dans le cloud) en:

$ python setup.py upload

Facultativement, vous pouvez également signer votre paquet avec GPG par,

$ python setup.py --sign upload

Bonus: Voir un exemple setup.py d'un projet réel ici: torchvision-setup.py

259
kmario23

setup.py est la réponse de Python à un programme d’installation multi-plateformes et à un fichier make

Si vous connaissez les installations en ligne de commande, make && make install se traduit par python setup.py build && python setup.py install

Certains paquets sont purement Python et ne sont compilés que par octets. D'autres peuvent contenir du code natif, ce qui nécessitera un compilateur natif (comme gcc ou cl) et un module d'interface Python (comme swig ou pyrex).

81
whatnick

Si vous avez téléchargé le paquet contenant "setup.py" dans le dossier racine, vous pouvez l’installer en lançant

python setup.py install

Si vous développez un projet et vous demandez pourquoi ce fichier est utile, consultez la documentation Python sur la rédaction du script d'installation

44
Pēteris Caune

setup.py est un script Python généralement fourni avec des bibliothèques ou des programmes, écrit dans ce langage. Son but est l'installation correcte du logiciel.

De nombreux paquets utilisent le framework distutils en conjonction avec setup.py.

http://docs.python.org/distutils/

17
Ferdinand Beyer

setup.py peut être utilisé dans deux scénarios. Premièrement, vous voulez installer un paquet Python. Deuxièmement, vous voulez créer votre propre paquet Python. Habituellement, le paquet Python standard contient quelques fichiers importants tels que setup.py, setup.cfg et Manifest.in. Lorsque vous créez le package Python, ces trois fichiers déterminent le nom (contenu dans PKG-INFO du dossier Egg-info), la version, la description, les autres installations requises (généralement dans le fichier .txt) et quelques autres paramètres. setup.cfg est lu par setup.py lors de la création du paquet (pourrait être tar.gz). Manifest.in vous permet de définir ce qui doit être inclus dans votre paquet. Quoi qu'il en soit, vous pouvez faire un tas de choses en utilisant setup.py comme 

python setup.py build
python setup.py install
python setup.py sdist <distname> upload [-r urltorepo]  (to upload package to pypi or local repo)

Il y a beaucoup d'autres commandes qui pourraient être utilisées avec setup.py. pour aider 

python setup.py --help-commands
14
Avichal Badaya

Pour installer un paquet Python que vous avez téléchargé, extrayez l'archive et exécutez le script setup.py à l'intérieur:

python setup.py install

Pour moi, cela a toujours semblé étrange. Il serait plus naturel de pointer un gestionnaire de paquets sur le téléchargement, comme on le ferait dans Ruby et Nodejs, par exemple. gem install Rails-4.1.1.gem

Un gestionnaire de paquets est également plus à l'aise, car il est familier et fiable. D'autre part, chaque setup.py est nouveau, car il est spécifique au package. Cela demande de la confiance dans la convention "J'espère que cette installation.py prend les mêmes commandes que d'autres que j'ai utilisées dans le passé". C'est une taxe regrettable sur la volonté mentale. 

Je ne dis pas que le flux de travail de setup.py est moins sécurisé qu'un gestionnaire de paquets (je comprends que Pip ne fait que lancer le fichier setup.py à l'intérieur), mais je pense que c'est vraiment difficile et choquant. Il y a une harmonie dans les commandes qui concernent toutes la même application de gestionnaire de paquets. Vous pourriez même aimer ça.

6
Colonel Panic

Lorsque vous téléchargez un package avec setup.py, ouvrez votre terminal (Mac, Linux) ou votre invite de commande (Windows). En utilisant cd et en vous aidant avec le bouton de tabulation, définissez le chemin d'accès au dossier dans lequel vous avez téléchargé le fichier et où il y a setup.py:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Appuyez sur Entrée, vous devriez voir quelque chose comme ceci:

iMac:pakagefolderwithsetupfile user$

Puis tapez après ce python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Appuyez sur enter. Terminé!

6
G M

setup.py est un fichier Python comme un autre. Il peut prendre n’importe quel nom, sauf convention, il est nommé setup.py, de sorte qu’il n’existe pas de procédure différente pour chaque script.

Le plus souvent, setup.py est utilisé pour installer un module Python mais le serveur remplit d’autres fonctions:

Modules:

C’est peut-être l’utilisation la plus connue de setup.py dans les modules. Bien qu'elles puissent être installées à l'aide de pip, les anciennes versions de Python n'incluaient pas pip par défaut et devaient être installées séparément. 

Si vous vouliez installer un module mais ne vouliez pas installer pip, la seule alternative consistait à installer le module à partir du fichier setup.py. Cela pourrait être réalisé via python setup.py install. Cela installerait le module Python dans le dictionnaire racine (sans pip, easy_install ect).

Cette méthode est souvent utilisée lorsque pip échouera. Par exemple, si la version Python appropriée du package souhaité n’est pas disponible via pipperhaps car elle n’est plus maintenue, le téléchargement de la source et l’exécution de python setup.py install produiraient la même chose, sauf que des fichiers binaires compilés sont nécessaires ( la version Python - sauf si une erreur est renvoyée).

Une autre utilisation de setup.py consiste à installer un package à partir de la source. Si un module est encore en cours de développement, les fichiers wheel ne seront pas disponibles et le seul moyen d’installation consiste à installer directement à partir de la source. 

Construire des extensions Python:

Lorsqu'un module est construit, il peut être converti en module prêt à être distribué à l'aide du script de configuration distutils . Une fois construits, ceux-ci peuvent être installés en utilisant la commande ci-dessus.

Un script de configuration est facile à construire et une fois le fichier correctement configuré, il peut être compilé en exécutant python setup.py build (voir le lien pour toutes les commandes).

Une fois encore, il est nommé setup.py pour la facilité d'utilisation et par convention, mais peut prendre n'importe quel nom.

Cython:

Une autre utilisation célèbre des fichiers setup.py inclut les extensions compilées. Celles-ci nécessitent un script d'installation avec des valeurs définies par l'utilisateur. Ils permettent une exécution rapide (une fois compilée dépendant de la plate-forme). Voici un exemple simple tiré de documentation :

from distutils.core import setup
from Cython.Build import cythonize

setup(
    name = 'Hello world app',
    ext_modules = cythonize("hello.pyx"),
)

Ceci peut être compilé via python setup.py build

Cx_Freeze:

Un autre module nécessitant un script d'installation est cx_Freeze. Cela convertit le script Python en exécutables. Cela permet à de nombreuses commandes telles que des descriptions, des noms, des icônes et des packages d'inclure, d'exclure ect et, une fois exécutées, produira une application distribuable. Un exemple tiré de documentation :

import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]} 

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "guifoo",
        version = "0.1",
        description = "My GUI application!",
        options = {"build_exe": build_exe_options},
        executables = [Executable("guifoo.py", base=base)])

Cela peut être compilé via python setup.py build.

Alors qu'est-ce qu'un fichier setup.py?

C'est tout simplement un script qui construit ou configure quelque chose dans l'environnement Python.

Un paquet distribué ne devrait contenir qu'un seul script d'installation, mais il n'est pas rare d'en combiner plusieurs en un seul script d'installation. Notez que cela implique souvent distutils mais pas toujours (comme je l’ai montré dans mon dernier exemple). Ce qu'il faut retenir, c'est simplement configurer le paquet/script Python. 

Il prend le nom pour que la même commande puisse toujours être utilisée lors de la construction ou de l’installation.

1
Simon

Pour simplifier les choses, setup.py est exécuté en tant que "__main__" lorsque vous appelez les fonctions install les autres réponses mentionnées. Dans setup.py, vous devriez mettre tout le nécessaire pour installer votre paquet.

Fonctions communes de setup.py

Les deux sections suivantes décrivent deux choses que beaucoup de modules setup.py ont. 

setuptools.setup

Cette fonction vous permet de spécifier les attributs du projet comme le nom du projet, la version ... Plus important encore, cette fonction vous permet d’installer d’autres fonctions si elles sont correctement empaquetées. Voir cette page Web pour un exemple de setuptools.setup

Ces attributs de setuptools.setup permettent d’installer ces types de packages:

Fonctions personnalisées

Dans un monde idéal, setuptools.setup se chargerait de tout. Malheureusement, ce n'est pas toujours le cas. Parfois, vous devez effectuer des tâches spécifiques, telles que l’installation de dépendances avec la commande subprocess , pour que le système sur lequel vous effectuez l’installation se trouve dans le bon état pour votre paquet. Essayez d'éviter cela, ces fonctions deviennent confuses et diffèrent souvent entre OS et même distribution .

0
user4757074