Qualcuno può spiegare cos'è setup.py
e come può essere configurato o utilizzato?
Qualcuno può spiegare cos'è setup.py
e come può essere configurato o utilizzato?
Risposte:
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 .
pip
utilizzerà setup.py per installare il modulo. Evita di chiamare setup.py
direttamente.
https://docs.python.org/3/installing/index.html#installing-index
setup.py
file.
Aiuta a installare un pacchetto python foo
sul tuo computer (può anche essere in virtualenv
) in modo da poter importare il pacchetto foo
da altri progetti e anche dai prompt [I] Python.
Fa il lavoro simile di pip
, easy_install
ecc.,
utilizzando setup.py
Cominciamo con alcune definizioni:
Pacchetto : una cartella / directory che contiene __init__.py
file.
Modulo : un file Python valido con .py
estensione.
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.py
script 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.py
in 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.py
da un progetto reale qui:torchvision-setup.py
requests
) ha questo progetto per fornire esplicitamente un buon esempio di setup.py - github.com/kennethreitz/setup.py
setup.py
è la risposta di Python a un programma di installazione e make
file multipiattaforma .
Se hai familiarità con le installazioni da riga di comando, allora si make && make install
traduce 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 gcc
o cl
) e un modulo di interfacciamento Python (come swig
o pyrex
).
python setup.py install
effettivamente viene eseguito per python setup.py build
primo (quindi non è necessario eseguirli separatamente se non in casi specifici). Credo che make
debba sempre essere eseguito manualmente prima di essere eseguito make install
.
make
non richiede parametri specifici (o ordini): dipende completamente dal creatore di Makefile
quali "target" sono disponibili (e in quale ordine devono essere invocati). Dato che i bare Makefile
sono (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 make
prima make install
o meno.
Se hai scaricato il pacchetto che ha "setup.py" nella cartella principale, puoi installarlo eseguendo
python setup.py install
Se stai sviluppando un progetto e ti stai chiedendo a cosa serva questo file, controlla la documentazione di Python durante la scrittura dello script di installazione
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 distutils
framework in congiunzione con setup.py
.
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
python setup.py --help-commands
. Molto utile quando si scava in setup.py.
Quando scarichi un pacchetto con setup.py
Apri 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!
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.
setup.py
è un file Python come un altro. Può assumere qualsiasi nome, tranne che per convenzione è chiamato in setup.py
modo che non ci sia una procedura diversa per ogni script.
Più frequentemente setup.py
viene 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 pip
per 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.py
file. Questo potrebbe essere ottenuto tramite python setup.py install
. Ciò installerebbe il modulo Python nel dizionario di root (senza pip
, easy_install
ect).
Questo metodo viene spesso utilizzato quando pip
fallirà. Ad esempio se la versione corretta di Python del pacchetto desiderato non è disponibile tramite pip
forse perché non è più mantenuta, il download del sorgente e l'esecuzione python setup.py install
eseguiranno 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.py
per facilità d'uso e per convenzione, ma può assumere qualsiasi nome.
Cython:
Un altro uso famoso dei setup.py
file 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.py
file?
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 distutils
ma 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.
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.
Le due sezioni seguenti illustrano due aspetti di molti moduli setup.py.
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/",]
In un mondo ideale, setuptools.setup
gestirà 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 .