¿Qué es setup.py?

992

¿Alguien puede explicar qué setup.pyes y cómo se puede configurar o usar?

Software entusiasta
fuente
77
Eric: ejemplos Better poner todo junto sería beneficiosa
Das.Rot
1
Para mí, siempre me pareció extraño cómo instalar el paquete, extraerlo y ejecutar el script dentro, en lugar de señalar a un administrador de paquetes lo que ha descargado. Eso sería más natural. stackoverflow.com/questions/1471994/what-is-setup-py/…
Coronel Panic

Respuestas:

694

setup.py es un archivo python, que generalmente le dice que el módulo / paquete que está a punto de instalar ha sido empaquetado y distribuido con Distutils, que es el estándar para distribuir módulos Python.

Esto le permite instalar fácilmente paquetes de Python. A menudo es suficiente escribir:

$ pip install . 

pipusará setup.py para instalar su módulo. Evita llamar setup.pydirectamente.

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

Silfverstrom
fuente
99
Le agradecería si comparte su conocimiento sobre cómo crear o manejar estos módulos. Por ejemplo, cómo crear un módulo básico o cómo probar un script en ./mymodule/bin que importa desde ./mymodule/libs/
Paulo Oliveira
77
@PauloOliveira Consulte Distribución de módulos de Python que describe Distutils, específicamente en 2. Escribir el script de configuración .
Yous
44
¡NUNCA USE la instalación de python setup.py! ¡Rompe tu versionado! stackoverflow.com/questions/4324558/…
devinbost
2
@MikeS No sé con certeza cuál es la solución, pero puedo decirte que ejecutar setup.py me ha llevado a problemas de pesadilla que requirieron muchas horas de limpieza. Supongo que construir / agrupar con pip o conda sería la solución.
devinbost
3
Puede cambiar el enlace a docs.python.org/3/installing/index.html , que es el enlace de documentación no heredado, y también sería bueno agregar un enlace a packaging.python.org/tutorials/distributing- paquetes / # setup-py donde expande el propósito del setup.pyarchivo.
Alvaro Gutierrez Perez
494

Ayuda a instalar un paquete de Python fooen su máquina (también puede estar en virtualenv) para que pueda importar el paquete foodesde otros proyectos y también desde las indicaciones de [I] Python.

Hace el trabajo similar de pip, easy_installetc.,


Utilizando setup.py

Comencemos con algunas definiciones:

Paquete : una carpeta / directorio que contiene el __init__.pyarchivo.
Módulo : un archivo Python válido con .pyextensión.
Distribución : cómo se relaciona un paquete con otros paquetes y módulos .

Digamos que desea instalar un paquete llamado foo. Entonces lo haces

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

En cambio, si no desea instalarlo realmente, pero aún así desea utilizarlo. Entonces hazlo,

$ python setup.py develop  

Este comando creará enlaces simbólicos al directorio fuente dentro de los paquetes del sitio en lugar de copiar cosas. Debido a esto, es bastante rápido (particularmente para paquetes grandes).


Creando setup.py

Si tienes tu árbol de paquetes como,

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

Luego, hace lo siguiente en su setup.pyscript para que pueda instalarse en alguna máquina:

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
)

En cambio, si su árbol de paquetes es más complejo como el siguiente:

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

Entonces, su setup.pyen este caso sería como:

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

Agregue más cosas a ( setup.py) y hágalo 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='[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',
           ]
)

Se long_descriptionutiliza en pypi.org como la descripción README de su paquete.


Y finalmente, ahora está listo para cargar su paquete en PyPi.org para que otros puedan instalar su paquete usando pip install yourpackage.

El primer paso es reclamar el nombre del paquete y el espacio en pypi usando:

$ python setup.py register

Una vez que se registra el nombre de su paquete, nadie puede reclamarlo ni utilizarlo. Después de un registro exitoso, debe cargar su paquete allí (a la nube),

$ python setup.py upload

Opcionalmente, también puede firmar su paquete con GPG,

$ python setup.py --sign upload

Bonificación : vea una muestra setup.pyde un proyecto real aquí:torchvision-setup.py

kmario23
fuente
12
Kenneth Reitz (autor del venerable requests) tiene este proyecto para dar explícitamente un buen ejemplo de setup.py - github.com/kennethreitz/setup.py
boweeb
¿Qué pasa con los subpaquetes, es decir, carpetas con módulos dentro del paquete?
fhchl
1
@ kmario23 Buena explicación, ¡gracias!
Dinko Pehar el
1
Me encanta esta respuesta
SW_user2953243
1
@ SW_user2953243 Me alegro de que te haya resultado útil :)
kmario23
98

setup.pyes la respuesta de Python a un instalador y makearchivo multiplataforma .

Si está familiarizado con las instalaciones de línea de comandos, entonces se make && make installtraduce en python setup.py build && python setup.py install.

Algunos paquetes son Python puro y solo se compilan en bytes. Otros pueden contener código nativo, que requerirá un compilador nativo (como gcco cl) y un módulo de interfaz de Python (como swigo pyrex).

que nada
fuente
1
Entonces, de acuerdo con la analogía anterior, si la construcción del módulo falla por alguna razón, jugaría con el script setup.py ... ¿correcto?
MonaLisaOverdrive
1
Sí, también puede haber algunos archivos de configuración que puede ver.
Whatnick
3
Corrígeme si me equivoco, pero creo que hay una pequeña diferencia entre los dos. python setup.py install en realidad se ejecuta python setup.py buildprimero (por lo que no necesita ejecutarlos por separado a menos que en casos específicos). Creo que makesiempre debe ejecutarse manualmente antes de ejecutarse make install.
joelostblom 01 de
66
@cheflo En realidad makeno requiere ningún parámetro específico (u orden): depende completamente del creador de Makefilequé "objetivos" están disponibles (y en qué orden deben invocarse). Dado que los bare ( Makefiles) generalmente no son muy portátiles, tienden a generarse usando comandos como ./configure(autotools) o cmake .(cmake) y, por lo tanto, estos programas pueden definir si es necesario ejecutarlo explícitamente makeantes make installo no.
ntninja
3
Necesito que alguien me diga si aún deberíamos usar setup.py según los documentos en docs.python.org/3/installing/index.html "Mientras que el uso directo de distutils se está eliminando, ... "
Kemin Zhou
20

setup.pyes un script de Python que generalmente se entrega con bibliotecas o programas, escrito en ese lenguaje. Su propósito es la correcta instalación del software.

Muchos paquetes usan el distutilsframework en conjunción con setup.py.

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

Fernando Beyer
fuente
19

setup.py se puede usar en dos escenarios. Primero, desea instalar un paquete de Python. En segundo lugar, desea crear su propio paquete de Python. Por lo general, el paquete estándar de Python tiene un par de archivos importantes como setup.py, setup.cfg y Manifest.in. Cuando esté creando el paquete Python, estos tres archivos determinarán el nombre (versión en PKG-INFO en la carpeta egg-info), la versión, la descripción, otras instalaciones requeridas (generalmente en el archivo .txt) y algunos otros parámetros. setup.cfg es leído por setup.py mientras se crea el paquete (podría ser tar.gz). Manifest.in es donde puede definir qué se debe incluir en su paquete. De todos modos, puedes hacer muchas cosas usando setup.py como

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

Hay muchos otros comandos que podrían usarse con setup.py. por ayuda

python setup.py --help-commands
Avichal Badaya
fuente
Gracias por el python setup.py --help-commands. Muy útil al cavar en el setup.py.
Palec
8

Cuando descargue un paquete con setup.pyabra su Terminal (Mac, Linux) o Símbolo del sistema (Windows). Usando cd y ayudándole con el botón Tab, configure la ruta a la carpeta donde descargó el archivo y donde está setup.py:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Presione enter, debería ver algo como esto:

iMac:pakagefolderwithsetupfile user$

Luego escriba después de esto python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install

Presione enter. ¡Hecho!

GM
fuente
7

Para instalar un paquete de Python que haya descargado, extraiga el archivo y ejecute el script setup.py dentro de:

python setup.py install

Para mí, esto siempre se ha sentido extraño. Sería más natural señalar a un administrador de paquetes en la descarga, como se haría en Ruby y Nodejs, por ejemplo.gem install rails-4.1.1.gem

Un administrador de paquetes también es más cómodo, porque es familiar y confiable. Por otro lado, cada uno setup.pyes novedoso porque es específico del paquete. Exige fe en la convención "Confío en este setup.py toma los mismos comandos que otros que he usado en el pasado". Es un impuesto lamentable sobre la fuerza de voluntad mental.

No estoy diciendo que el flujo de trabajo setup.py sea menos seguro que un administrador de paquetes (entiendo que Pip solo ejecuta setup.py por dentro), pero ciertamente siento que es extraño y discordante. Hay una armonía entre los comandos y todos están en la misma aplicación de administrador de paquetes. Puede que incluso te encariñes.

Coronel Panic
fuente
1
Entonces podría usar easy_install o similar. Por cierto, Python tiene huevos, algo similar a las gemas de rubí.
Pavel Šimerda
7

setup.pyes un archivo de Python como cualquier otro. Puede tomar cualquier nombre, excepto por convención, se nombra setup.pypara que no haya un procedimiento diferente con cada script.

Con mayor frecuencia setup.pyse utiliza para instalar un módulo de Python, pero el servidor tiene otros fines:

Módulos:

Quizás este es el uso más famoso de setup.pyes en módulos. Aunque se pueden instalar usando pip, las versiones antiguas de Python no se incluyen pippor defecto y deben instalarse por separado.

Si desea instalar un módulo pero no desea instalarlo pip, la única alternativa era instalar el módulo desde el setup.pyarchivo. Esto podría lograrse a través de python setup.py install. Esto instalaría el módulo Python en el diccionario raíz (sin pip, easy_installect).

Este método se usa a menudo cuando pipfallará. Por ejemplo, si la versión correcta de Python del paquete deseado no está disponible a través de pipquizás porque ya no se mantiene, descargar la fuente y ejecutarla python setup.py installrealizaría lo mismo, excepto en el caso de que se requieran binarios compilados, (pero ignorará el Versión de Python, a menos que se devuelva un error).

Otro uso de setup.pyes instalar un paquete desde la fuente. Si todavía se está desarrollando un módulo, los archivos de rueda no estarán disponibles y la única forma de instalarlo es instalarlo directamente desde la fuente.

Construyendo extensiones de Python:

Cuando se ha construido un módulo, se puede convertir en un módulo listo para su distribución utilizando un script de configuración de distutils . Una vez construidos, estos se pueden instalar utilizando el comando anterior.

Un script de configuración es fácil de construir y una vez que el archivo se ha configurado correctamente y se puede compilar ejecutando python setup.py build(consulte el enlace para ver todos los comandos).

Una vez más se llama así setup.pypor su facilidad de uso y por convención, pero puede tomar cualquier nombre.

Cython:

Otro uso famoso de setup.pyarchivos incluye extensiones compiladas. Estos requieren un script de configuración con valores definidos por el usuario. Permiten una ejecución rápida (pero una vez compilada dependen de la plataforma). Aquí hay un ejemplo simple de la documentación :

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

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

Esto se puede compilar a través de python setup.py build

Cx_Freeze:

Otro módulo que requiere un script de configuración es cx_Freeze. Esto convierte el script de Python en ejecutables. Esto permite que muchos comandos, como descripciones, nombres, iconos, paquetes, incluyan, excluyan ect y, una vez ejecutados, producirán una aplicación distribuible. Un ejemplo de la documentación :

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

Esto se puede compilar a través de python setup.py build.

Entonces, ¿qué es un setup.pyarchivo?

En pocas palabras, es un script que construye o configura algo en el entorno Python.

Un paquete distribuido debe contener solo un script de configuración, pero no es raro combinar varios en un solo script de configuración. Tenga en cuenta que esto a menudo implica distutilspero no siempre (como mostré en mi último ejemplo). Lo que hay que recordar es que solo configura el paquete / script Python de alguna manera.

Toma el nombre para que siempre se pueda usar el mismo comando al construir o instalar.

Simón
fuente
6

Para hacerlo simple, setup.py se ejecuta como "__main__"cuando llama a las funciones de instalación que mencionan las otras respuestas. Dentro de setup.py, debe poner todo lo necesario para instalar su paquete.

Funciones comunes de setup.py

Las siguientes dos secciones analizan dos cosas que tienen muchos módulos setup.py.

setuptools.setup

Esta función le permite especificar atributos del proyecto como el nombre del proyecto, la versión ... Lo más importante, esta función le permite instalar otras funciones si están empaquetadas correctamente. Consulte esta página web para ver un ejemplo de setuptools.setup.

Estos atributos de setuptools.setup permiten instalar estos tipos de paquetes:

  • Paquetes importados a su proyecto y listados en PyPI usando setuptools.findpackages :

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

  • Paquetes que no están en PyPI , pero se pueden descargar desde una URL usando dependency_links

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

Funciones personalizadas

En un mundo ideal, setuptools.setupmanejaría todo por ti. Lamentablemente, este no es siempre el caso. A veces tiene que hacer cosas específicas, como instalar dependencias con el comando de subproceso , para obtener el sistema en el que está instalando en el estado correcto para su paquete. Intente evitar esto, estas funciones se vuelven confusas y a menudo difieren entre el sistema operativo e incluso la distribución .

mikeLundquist
fuente