Che cos'è setup.py?


992

Qualcuno può spiegare cos'è setup.pye come può essere configurato o utilizzato?


7
Eric: Esempi migliori mettere insieme tutto sarebbe vantaggioso
Das.Rot

1
Per me, mi è sempre sembrato strano come installare il pacchetto in cui lo estrai ed eseguire lo script all'interno, piuttosto che indicare un gestore di pacchetti a ciò che hai scaricato. Sarebbe più naturale. stackoverflow.com/questions/1471994/what-is-setup-py/…
Colonnello Panic,

Risposte:


694

setup.py è un file python, che di solito ti dice che il modulo / pacchetto che stai per installare è stato impacchettato e distribuito con Distutils, che è lo standard per la distribuzione dei moduli Python.

Ciò consente di installare facilmente i pacchetti Python. Spesso basta scrivere:

$ pip install . 

piputilizzerà setup.py per installare il modulo. Evita di chiamare setup.pydirettamente.

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


9
Gradirei se condividessi le tue conoscenze su come creare o gestire questi moduli? Ad esempio, come creare un modulo di base o come testare uno script su ./mymodule/bin che importa da ./mymodule/libs/
Paulo Oliveira,

7
@PauloOliveira Vedi Distribuire i moduli Python che descrivono Distutils, in particolare esaminare 2. Scrivere lo script di installazione .
Yous

4
MAI USARE python setup.py install! Rompe il tuo controllo delle versioni! stackoverflow.com/questions/4324558/...
devinbost

2
@MikeS Non so con certezza quale sia la soluzione, ma posso dirti che l'esecuzione di setup.py mi ha portato a problemi da incubo che hanno richiesto molte ore di pulizia. Immagino che costruire / raggruppare con pip o conda sarebbe la soluzione.
Devinbost,

3
È possibile modificare il collegamento in docs.python.org/3/installing/index.html , che è il collegamento di documentazione non legacy, e sarebbe anche utile aggiungere un collegamento a packaging.python.org/tutorials/distributing- pacchetti / # setup-py dove espande lo scopo del setup.pyfile.
Alvaro Gutierrez Perez,

494

Aiuta a installare un pacchetto python foosul tuo computer (può anche essere in virtualenv) in modo da poter importare il pacchetto fooda altri progetti e anche dai prompt [I] Python.

Fa il lavoro simile di pip, easy_installecc.,


utilizzando setup.py

Cominciamo con alcune definizioni:

Pacchetto : una cartella / directory che contiene __init__.pyfile.
Modulo : un file Python valido con .pyestensione.
Distribuzione : relazione di un pacchetto con altri pacchetti e moduli .

Supponiamo che tu voglia installare un pacchetto chiamato foo. Poi lo fai

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

Invece, se non si desidera installarlo effettivamente, ma si desidera comunque utilizzarlo. Quindi fa,

$ python setup.py develop  

Questo comando creerà collegamenti simbolici alla directory di origine all'interno dei pacchetti del sito invece di copiare le cose. Per questo motivo, è abbastanza veloce (in particolare per i pacchetti di grandi dimensioni).


Creazione setup.py

Se hai l'albero dei pacchetti simile,

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

Quindi, esegui le seguenti operazioni nel tuo setup.pyscript in modo che possa essere installato su alcuni computer:

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
)

Invece, se l'albero dei pacchetti è più complesso come quello qui sotto:

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

Quindi, setup.pyin questo caso sarebbe come:

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',
           ]
)

Aggiungi più cose a ( setup.py) e rendilo decente:

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',
           ]
)

Il file long_descriptionè usato in pypi.org come descrizione README del pacchetto.


Infine, ora sei pronto per caricare il tuo pacchetto su PyPi.org in modo che altri possano installarlo usando pip install yourpackage.

Il primo passo è rivendicare il nome e lo spazio del pacchetto in pypi usando:

$ python setup.py register

Una volta registrato il nome del pacchetto, nessuno può richiederlo o utilizzarlo. Dopo aver effettuato correttamente la registrazione, devi caricare il tuo pacchetto lì (sul cloud) tramite,

$ python setup.py upload

Facoltativamente, puoi anche firmare il tuo pacchetto con GPG,

$ python setup.py --sign upload

Bonus : vedi un campione setup.pyda un progetto reale qui:torchvision-setup.py


12
Kenneth Reitz (autore del venerabile requests) ha questo progetto per fornire esplicitamente un buon esempio di setup.py - github.com/kennethreitz/setup.py
boweeb

Che dire dei sotto-pacchetti, ovvero cartelle con moduli all'interno del pacchetto?
fhchl

1
@ kmario23 Bella spiegazione, grazie!
Dinko Pehar,

1
Adoro questa risposta
SW_user2953243,

1
@ SW_user2953243 Sono contento che tu l'abbia trovato utile :)
kmario23

98

setup.pyè la risposta di Python a un programma di installazione e makefile multipiattaforma .

Se hai familiarità con le installazioni da riga di comando, allora si make && make installtraduce in python setup.py build && python setup.py install.

Alcuni pacchetti sono Python puro e sono compilati solo a byte. Altri possono contenere codice nativo, che richiederà un compilatore nativo (come gcco cl) e un modulo di interfacciamento Python (come swigo pyrex).


1
Quindi, secondo l'analogia di cui sopra, se la costruzione del modulo fallisse per qualche motivo, armeggerei con lo script setup.py ... corretto?
MonaLisa Overdrive,

1
Sì, potrebbero essere presenti anche alcuni file di configurazione.
whatnick

3
Correggimi se sbaglio, ma credo che ci sia una piccola differenza tra i due. python setup.py install effettivamente viene eseguito per python setup.py buildprimo (quindi non è necessario eseguirli separatamente se non in casi specifici). Credo che makedebba sempre essere eseguito manualmente prima di essere eseguito make install.
Joelostblom,

6
@cheflo In realtà makenon richiede parametri specifici (o ordini): dipende completamente dal creatore di Makefilequali "target" sono disponibili (e in quale ordine devono essere invocati). Dato che i bare Makefilesono (di solito) poco portatili, tendono ad essere generati usando comandi come ./configure(autotools) o cmake .(cmake) ed è quindi necessario che questi programmi definiscano se è necessario eseguire esplicitamente makeprima make installo meno.
ntninja,

3
Ho bisogno di qualcuno che mi dica se dovremmo ancora usare setup.py secondo i documenti di docs.python.org/3/installing/index.html "Mentre l'uso diretto di distutils viene gradualmente eliminato, ... "
Kemin Zhou,


20

setup.pyè uno script Python che viene solitamente fornito con librerie o programmi, scritto in quella lingua. Lo scopo è l'installazione corretta del software.

Molti pacchetti usano il distutilsframework in congiunzione con setup.py.

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


19

setup.py può essere utilizzato in due scenari, in primo luogo, si desidera installare un pacchetto Python. Secondo, vuoi creare il tuo pacchetto Python. Di solito il pacchetto Python standard ha un paio di file importanti come setup.py, setup.cfg e Manifest.in. Quando si crea il pacchetto Python, questi tre file determineranno il nome (contenuto in PKG-INFO nella cartella egg-info) nome, versione, descrizione, altre installazioni richieste (di solito nel file .txt) e pochi altri parametri. setup.cfg viene letto da setup.py mentre viene creato il pacchetto (potrebbe essere tar.gz). Manifest.in è dove puoi definire cosa dovrebbe essere incluso nel tuo pacchetto. Ad ogni modo puoi fare un sacco di cose usando setup.py come

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

Ci sono molti altri comandi che potrebbero essere usati con setup.py. per un aiuto

python setup.py --help-commands

Grazie per il python setup.py --help-commands. Molto utile quando si scava in setup.py.
Palec,

8

Quando scarichi un pacchetto con setup.pyApri il tuo Terminale (Mac, Linux) o Prompt dei comandi (Windows). Usando cd e aiutandoti con il pulsante Tab, imposta il percorso direttamente alla cartella in cui hai scaricato il file e dove c'è setup.py:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Premi Invio, dovresti vedere qualcosa del genere:

iMac:pakagefolderwithsetupfile user$

Quindi digitare dopo questo python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Press enter. Fatto!


7

Per installare un pacchetto Python scaricato, estrarre l'archivio ed eseguire lo script setup.py all'interno:

python setup.py install

Per me, questo è sempre stato strano. Sarebbe più naturale indicare un gestore di pacchetti al download, come si farebbe in Ruby e Nodejs, ad es.gem install rails-4.1.1.gem

Un gestore di pacchetti è anche più comodo, perché è familiare e affidabile. D'altra parte, ognuno setup.pyè nuovo, perché è specifico per il pacchetto. Richiede fiducia nella convenzione "Mi fido di questo setup.py accetta gli stessi comandi degli altri che ho usato in passato". Questa è una tassa deplorevole sulla forza di volontà mentale.

Non sto dicendo che il flusso di lavoro di setup.py sia meno sicuro di un gestore di pacchetti (capisco che Pip esegue solo setup.py all'interno), ma certamente sento che è imbarazzante e stonante. C'è un'armonia tra i comandi che riguardano tutti la stessa applicazione di gestione pacchetti. Potresti persino appassionarti.


1
Quindi è possibile utilizzare easy_install o simili. A proposito, Python ha uova, un po 'simili alle gemme di rubino.
Pavel Šimerda,

7

setup.pyè un file Python come un altro. Può assumere qualsiasi nome, tranne che per convenzione è chiamato in setup.pymodo che non ci sia una procedura diversa per ogni script.

Più frequentemente setup.pyviene utilizzato per installare un modulo Python ma per altri scopi del server:

moduli:

Forse questo è l'uso più famoso di setup.pyè nei moduli. Sebbene possano essere installati utilizzando pip, le versioni precedenti di Python non includevano pipper impostazione predefinita e dovevano essere installate separatamente.

Se volevi installare un modulo ma non volevi installarlo pip, l'unica alternativa era installare il modulo dal setup.pyfile. Questo potrebbe essere ottenuto tramite python setup.py install. Ciò installerebbe il modulo Python nel dizionario di root (senza pip, easy_installect).

Questo metodo viene spesso utilizzato quando pipfallirà. Ad esempio se la versione corretta di Python del pacchetto desiderato non è disponibile tramite pipforse perché non è più mantenuta, il download del sorgente e l'esecuzione python setup.py installeseguiranno la stessa cosa, tranne nel caso in cui siano richiesti binari compilati, (ma ignoreranno il Versione Python - a meno che non venga restituito un errore).

Un altro uso di setup.pyè installare un pacchetto dal sorgente. Se un modulo è ancora in fase di sviluppo, i file della ruota non saranno disponibili e l'unico modo per l'installazione è l'installazione diretta dal sorgente.

Creazione di estensioni Python:

Quando un modulo è stato creato, può essere convertito in modulo pronto per la distribuzione usando uno script di installazione distutils . Una volta compilati, questi possono essere installati utilizzando il comando sopra.

Uno script di installazione è facile da costruire e una volta che il file è stato correttamente configurato e può essere compilato eseguendo python setup.py build(vedi link per tutti i comandi).

Ancora una volta prende il nome setup.pyper facilità d'uso e per convenzione, ma può assumere qualsiasi nome.

Cython:

Un altro uso famoso dei setup.pyfile include estensioni compilate. Questi richiedono uno script di installazione con valori definiti dall'utente. Consentono l'esecuzione rapida (ma una volta compilata dipende dalla piattaforma). Ecco un semplice esempio dalla documentazione :

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

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

Questo può essere compilato tramite python setup.py build

Cx_Freeze:

Un altro modulo che richiede uno script di installazione è cx_Freeze. Questo converte lo script Python in file eseguibili. Ciò consente a molti comandi come descrizioni, nomi, icone, pacchetti di includere, escludere ect e una volta eseguito produrrà un'applicazione distribuibile. Un esempio dalla documentazione :

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)])

Questo può essere compilato tramite python setup.py build.

Quindi cos'è un setup.pyfile?

Semplicemente è uno script che costruisce o configura qualcosa nell'ambiente Python.

Un pacchetto distribuito dovrebbe contenere solo uno script di installazione ma non è raro combinarne più insieme in un unico script di installazione. Si noti che ciò comporta spesso distutilsma non sempre (come ho mostrato nel mio ultimo esempio). La cosa da ricordare è che configura il pacchetto / script Python in qualche modo.

Prende il nome in modo che lo stesso comando possa sempre essere utilizzato durante la creazione o l'installazione.


6

Per semplificare, setup.py viene eseguito come "__main__"quando chiamate le funzioni di installazione, le altre risposte menzionate. All'interno di setup.py, dovresti inserire tutto il necessario per installare il tuo pacchetto.

Funzioni setup.py comuni

Le due sezioni seguenti illustrano due aspetti di molti moduli setup.py.

setuptools.setup

Questa funzione consente di specificare gli attributi del progetto come il nome del progetto, la versione .... Ancora più importante, questa funzione consente di installare altre funzioni se sono impacchettate correttamente. Vedere questa pagina Web per un esempio di setuptools.setup

Questi attributi di setuptools.setup consentono di installare questi tipi di pacchetti:

  • I pacchetti che vengono importati nel progetto e elencati nella PyPI utilizzando setuptools.findpackages :

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

  • I pacchetti non sono in PyPI , ma possono essere scaricati da un URL usando dependency_links

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

Funzioni personalizzate

In un mondo ideale, setuptools.setupgestirà tutto per te. Purtroppo questo non è sempre il caso. A volte devi fare cose specifiche, come installare dipendenze con il comando subprocess , per ottenere il sistema su cui stai installando nello stato giusto per il tuo pacchetto. Cerca di evitarlo, queste funzioni diventano confuse e spesso differiscono tra sistema operativo e distribuzione uniforme .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.