Qu'est-ce que setup.py?


992

Quelqu'un peut-il expliquer ce qu'est setup.pyet comment il peut être configuré ou utilisé?


7
Eric: De meilleurs exemples pour tout rassembler seraient
bénéfiques

1
Pour moi, il est toujours étrange d'installer le package que vous extrayez et d'exécuter le script à l'intérieur, plutôt que de diriger un gestionnaire de packages vers ce que vous avez téléchargé. Ce serait plus naturel. stackoverflow.com/questions/1471994/what-is-setup-py/…
Colonel Panic

Réponses:


695

setup.py est un fichier python, qui vous indique généralement que le module / package que vous êtes sur le point d'installer a été empaqueté et distribué avec Distutils, qui est la norme pour la distribution des modules Python.

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

$ pip install . 

piputilisera setup.py pour installer votre module. Évitez d'appeler setup.pydirectement.

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


9
Je vous serais reconnaissant si vous partagez vos connaissances sur la façon de créer ou de gérer ces modules? Par exemple, comment créer un module de base, ou comment tester un script sur ./mymodule/bin qui importe de ./mymodule/libs/
Paulo Oliveira

7
@PauloOliveira Voir Distribution de modules Python qui décrit Distutils, examinez en particulier 2. Écriture du script de configuration .
Yous

4
N'UTILISEZ JAMAIS l'installation de python setup.py! Cela casse votre versioning! stackoverflow.com/questions/4324558/…
devinbost

2
@MikeS Je ne sais pas avec certitude quelle est la solution de contournement, mais je peux vous dire que l'exécution de setup.py m'a conduit à des problèmes de cauchemar qui ont nécessité de nombreuses heures de nettoyage. Je suppose que la construction / le regroupement avec pip ou conda serait la solution.
devinbost

3
Vous pouvez modifier le lien vers docs.python.org/3/installing/index.html , qui est le lien de documentation non hérité, et il serait également bon d'ajouter un lien vers packaging.python.org/tutorials/distributing- packages / # setup-py où il explique le but du setup.pyfichier.
Alvaro Gutierrez Perez

494

Cela aide à installer un package python foosur votre machine (peut également l'être virtualenv) afin que vous puissiez importer le package à foopartir d'autres projets et également à partir des invites [I] Python.

Il fait le travail similaire de pip, easy_installetc.,


En utilisant setup.py

Commençons par quelques définitions:

Package - Un dossier / répertoire qui contient un __init__.pyfichier.
Module - Un fichier python valide avec une .pyextension.
Distribution - Lien entre un package et d'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 souhaitez pas réellement l'installer mais souhaitez tout de même l'utiliser. Alors fais,

$ python setup.py develop  

Cette commande créera des liens symboliques vers le répertoire source dans les packages de site au lieu de copier des choses. Pour cette raison, il est assez rapide (en particulier pour les gros colis).


Créer setup.py

Si vous avez votre arborescence de packages comme,

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

Ensuite, vous effectuez les opérations suivantes dans votre setup.pyscript 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='foomail@foo.com',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
)

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

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

Ensuite, votre setup.pydans ce cas serait comme:

from setuptools import setup

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

Ajoutez plus de choses à ( setup.py) et rendez-le 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='foomail@foo.com',
   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_descriptionest utilisé dans pypi.org comme description README de votre paquet.


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

La première étape consiste à réclamer le nom et l'espace de votre package dans pypi en utilisant:

$ python setup.py register

Une fois le nom de votre colis enregistré, personne ne peut le réclamer ou l'utiliser. Après une inscription réussie, vous devez y télécharger votre package (dans le cloud) par,

$ python setup.py upload

En option, vous pouvez également signer votre colis avec GPGpar,

$ python setup.py --sign upload

Bonus : Voir un échantillon setup.pyd'un vrai projet ici:torchvision-setup.py


12
Kenneth Reitz (auteur du vénérable requests) a ce projet pour donner explicitement un bon exemple de setup.py - github.com/kennethreitz/setup.py
boweeb

Qu'en est-il des sous-packages, c'est-à-dire des dossiers avec des modules à l'intérieur du package?
fhchl

1
@ kmario23 Belle explication, merci!
Dinko Pehar

1
J'aime cette réponse
SW_user2953243

1
@ SW_user2953243 Je suis content que vous l'ayez trouvé utile :)
kmario23

98

setup.pyest la réponse de Python à un programme d'installation et à un makefichier multi-plateforme .

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

Certains packages sont en pur Python et ne sont compilés qu'en octets. D'autres peuvent contenir du code natif, qui nécessitera un compilateur natif (comme gccou cl) et un module d'interface Python (comme swigou pyrex).


1
Donc, selon l'analogie ci-dessus, si la construction du module échouait pour une raison quelconque, je bricolerais avec le script setup.py ... correct?
MonaLisaOverdrive

1
Oui, vous pouvez également consulter certains fichiers de configuration.
Whatnick

3
Corrigez-moi si je me trompe, mais je pense qu'il y a une petite différence entre les deux. python setup.py install s'exécute en fait en python setup.py buildpremier (vous n'avez donc pas besoin de les exécuter séparément sauf dans des cas spécifiques). Je crois qu'il makefaut toujours exécuter manuellement avant d'exécuter make install.
joelostblom

6
@cheflo En makefait, ne nécessite aucun paramètre (ou ordre) spécifique: c'est au créateur de déterminer Makefilequelles "cibles" sont disponibles (et dans quel ordre elles doivent être invoquées). Étant donné que les Makefiles bare ne sont (généralement) pas très portables, ils ont tendance à être générés à l'aide de commandes telles que ./configure(autotools) ou cmake .(cmake) et c'est à ces programmes de définir si vous devez exécuter explicitement makeavant make installou non.
ntninja

3
J'ai besoin que quelqu'un me dise si nous devrions encore utiliser setup.py selon les documents sur docs.python.org/3/installing/index.html "Alors que l'utilisation directe de distutils est progressivement supprimée, ... "
Kemin Zhou


20

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

De nombreux packages utilisent le distutilsframework en conjonction avec setup.py.

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


19

setup.py peut être utilisé dans deux scénarios. Premièrement, vous souhaitez installer un package Python. Deuxièmement, vous souhaitez créer votre propre package Python. Habituellement, le package 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étermineront le (contenu dans PKG-INFO sous le 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 package (peut être tar.gz). Manifest.in est l'endroit où vous pouvez définir ce qui doit être inclus dans votre package. Quoi qu'il en soit, vous pouvez faire beaucoup 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 existe de nombreuses autres commandes qui pourraient être utilisées avec setup.py. pour aider

python setup.py --help-commands

Merci pour le python setup.py --help-commands. Très utile pour creuser dans setup.py.
Palec

8

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

iMac:~ user $ cd path/pakagefolderwithsetupfile/

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

iMac:pakagefolderwithsetupfile user$

Tapez ensuite après ceci python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Appuyez sur enter. Terminé!


7

Pour installer un package Python que vous avez téléchargé, vous 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 vers 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 confortable, car il est familier et fiable. En revanche, chacun setup.pyest nouveau, car il est spécifique au package. Il exige la foi dans la convention "Je fais confiance à ce setup.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 setup.py est moins sécurisé qu'un gestionnaire de paquets (je comprends que Pip exécute simplement setup.py à l'intérieur), mais je pense certainement que c'est maladroit et discordant. Il y a une harmonie entre les commandes et la même application du gestionnaire de paquets. Vous pourriez même en devenir friand.


1
Ensuite, vous pouvez utiliser easy_install ou similaire. En fait, Python a des œufs, un peu comme des pierres précieuses rubis.
Pavel Šimerda

7

setup.pyest un fichier Python comme les autres. Il peut prendre n'importe quel nom, sauf par convention qu'il est nommé de setup.pysorte qu'il n'y ait pas de procédure différente avec chaque script.

Le plus souvent setup.pyest utilisé pour installer un module Python mais pour servir à d'autres fins:

Modules:

Il s'agit peut-être de l'utilisation la plus connue des setup.pymodules. Bien qu'elles puissent être installées à l'aide pip, les anciennes versions de Python n'incluaient pas pippar défaut et devaient être installées séparément.

Si vous vouliez installer un module mais ne vouliez pas l'installer pip, à peu près la seule alternative était d'installer le module à partir d'un setup.pyfichier. Cela pourrait être réalisé via python setup.py install. Cela installerait le module Python dans le dictionnaire racine (sans pip, easy_installect).

Cette méthode est souvent utilisée en cas d' pipéchec. Par exemple, si la version Python correcte du package souhaité n'est pas disponible via pippeut-être parce qu'elle n'est plus maintenue, le téléchargement de la source et son exécution python setup.py installeffectueraient la même chose, sauf dans le cas où des binaires compilés sont requis (mais ignorera le Version Python - sauf si une erreur est retournée).

Une autre utilisation de setup.pyest d'installer un paquet depuis la source. Si un module est encore en cours de développement, les fichiers de roue ne seront pas disponibles et la seule façon d'installer est d'installer directement depuis la source.

Construire des extensions Python:

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

Un script d'installation est facile à construire et une fois que le fichier a été correctement configuré et peut être compilé en exécutant python setup.py build(voir le lien pour toutes les commandes).

Encore une fois, il est nommé setup.pypour sa facilité d'utilisation et par convention, mais peut prendre n'importe quel nom.

Cython:

Une autre utilisation célèbre des setup.pyfichiers comprend les extensions compilées. Ceux-ci nécessitent un script de configuration avec des valeurs définies par l'utilisateur. Ils permettent une exécution rapide (mais une fois compilée dépend de la plate-forme). Voici un exemple simple de la documentation :

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

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

Cela 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 les descriptions, les noms, les icônes, les packages d'inclure, d'exclure ect et une fois exécutées produira une application distribuable. Un exemple tiré de la 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 setup.pyfichier?

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

Un package, lorsqu'il est distribué, ne doit contenir qu'un seul script de configuration, mais il n'est pas rare d'en combiner plusieurs en un seul script de configuration. Notez que cela implique souvent distutilsmais pas toujours (comme je l'ai montré dans mon dernier exemple). La chose à retenir est simplement de configurer le package / script Python d'une manière ou d'une autre.

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


6

Pour simplifier, setup.py est exécuté comme "__main__"lorsque vous appelez les fonctions d'installation les autres réponses mentionnées. Dans setup.py, vous devez mettre tout le nécessaire pour installer votre package.

Fonctions setup.py communes

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

setuptools.setup

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

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

  • Packages importés dans votre projet et répertoriés dans PyPI à l' aide de setuptools.findpackages :

    packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])

  • Les packages ne sont pas dans PyPI , mais peuvent être téléchargés à partir d'une URL à l'aide de dependency_links

    dependency_links=["http://peak.telecommunity.com/snapshots/",]

Fonctions personnalisées

Dans un monde idéal, setuptools.setupgérerait tout pour vous. Malheureusement, ce n'est pas toujours le cas. Parfois, vous devez faire des choses spécifiques, comme installer des dépendances avec la commande subprocess , pour obtenir le système sur lequel vous installez dans le bon état pour votre package. Essayez d'éviter cela, ces fonctions prêtent à confusion et diffèrent souvent entre le système d'exploitation et même la distribution .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.