¿Qué es setup.py?


¿Puede alguien explicar qué es setup.py y cómo se puede configurar o utilizar?

Author: kmario23, 2009-09-24

10 answers

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 Python. A menudo es suficiente escribir:

$ python setup.py install

Y el módulo se instalará solo.

Http://docs.python.org/install/index.html

 406
Author: Silfverstrom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-06 15:32:15

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

Hace el trabajo similar de pip, easy_install etc.,


Usando setup.py

Comencemos con algunas definiciones:

Package - Una carpeta/directorio que contiene el archivo __init__.py.
Module - Un archivo python válido con extensión .py.
Distribución - Cómo se relaciona un paquete con otros paquetes y módulos .

Supongamos que desea instalar un paquete llamado foo. Entonces lo haces,

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

En su lugar, si no desea instalarlo realmente, pero aún así le gustaría usarlo. Entonces hazlo,

$ python setup.py develop  

Este comando creará enlaces simbólicos al directorio fuente dentro de site-packages en lugar de copiar cosas. Debido a esto, es bastante rápido (especialmente 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

Entonces, usted hace lo siguiente en su setup.py script para que pueda ser instalado 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.py en este caso sería:

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

Añadir más cosas a (setup.py) & que sea 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',
           ]
)

El long_description se utiliza en pypi.org como la descripción README de su paquete.


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

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

$ python setup.py register

Una vez que su nombre de paquete está registrado, nadie puede reclamarlo o usarlo. Después del registro exitoso, usted tiene para cargar su paquete allí (a la nube) por,

$ python setup.py upload

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

$ python setup.py --sign upload

Bono: Ver una muestra setup.py a partir de un proyecto real aquí: torchvision-setup.py

 183
Author: kmario23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-12 16:04:19

setup.py es la respuesta de Python a un instalador multiplataforma y un archivo make.

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

Algunos paquetes son Python puros, y solo están compilados en bytes. Otros pueden contener código nativo, que requerirá un compilador nativo (como gcc o cl) y un módulo de interfaz Python (como swig o pyrex).

 73
Author: whatnick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-20 15:22:01

Si ha descargado el paquete que tiene "setup.py" en la carpeta raíz, puede instalarlo ejecutando

python setup.py install

Si está desarrollando un proyecto y se pregunta para qué es útil este archivo, consulte la documentación de Python sobre cómo escribir el Script de instalación

 43
Author: Pēteris Caune,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-24 14:21:46

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

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

Http://docs.python.org/distutils /

 15
Author: Ferdinand Beyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-24 14:21:58

Setup.py se puede usar en dos escenarios, primero, desea instalar un paquete Python. En segundo lugar, desea crear su propio paquete Python. Por lo general, el paquete estándar de Python tiene un par de archivos importantes como setup.py, instalación.cfg y Manifest.in. Al crear el paquete Python, estos tres archivos determinarán el (contenido en PKG-INFO en la carpeta egg-info) nombre, versión, descripción, otras instalaciones requeridas (generalmente en .txt) y algunos otros parámetros. configuración.cfg es leído por setup.py mientras se crea el paquete (podría ser tar.gz). Manifest.in es donde puede definir lo que debe incluirse en su paquete. De todos modos se puede hacer un montón de 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 un montón de otros comandos que podrían utilizarse con setup.py . para ayuda

python setup.py --help-commands
 14
Author: Avichal Badaya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-12 07:42:55

Al descargar un paquete con setup.py abra su Terminal (Mac,Linux) o Símbolo del sistema (Windows). Usando cd y ayudándote con el botón Tab establece la ruta a la carpeta donde has descargado el archivo y donde hay 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

Pulse enter. Hecho!

 6
Author: G M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-18 10:49:14

Para instalar un paquete de Python que ha descargado, extrae el archivo y ejecuta el setup.py script inside:

python setup.py install

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

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

No estoy diciendo la setup.py el flujo de trabajo es menos seguro que un administrador de paquetes (entiendo que Pip solo ejecuta setup.py adentro), pero ciertamente siento que es torpe y discordante. Hay una armonía para que todos los comandos sean para la misma aplicación de administrador de paquetes. Puede que incluso te guste.

 6
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-03 23:34:21

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

Frecuentes setup.py funciones

Las siguientes dos secciones discuten dos cosas muchas setup.py los módulos tienen.

Setuptools.configuración

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. Vea esta página web para un ejemplo de setuptools.configuración

Estos atributos de setuptools.configuración habilite la instalación de estos tipos de paquetes:

Funciones personalizadas

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

 0
Author: user4757074,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-15 16:06:29

setup.py es un archivo Python como cualquier otro. Puede tomar cualquier nombre, excepto que por convención se llama setup.py para que no haya un procedimiento diferente con cada script.

Más frecuentemente setup.py se usa para instalar un módulo de Python pero el servidor tiene otros propósitos:

Módulos:

Tal vez este es el uso más famoso de setup.py es en módulos. Aunque se pueden instalar usando pip, las versiones antiguas de Python no incluían pip por defecto y tenían que ser instalado por separado.

Si quería instalar un módulo, pero no desea instalar pip, casi la única alternativa era para instalar el módulo de setup.py archivo. 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_install ect).

Este método se utiliza a menudo cuando pip fallará. Por ejemplo, si la versión correcta de Python del paquete deseado no está disponible a través de piptal vez porque ya no lo está maintained,, descargar el código fuente y ejecutar python setup.py install realizaría lo mismo, excepto en el caso de que se requieran binarios compilados, (pero ignorará la versión de Python-a menos que se devuelva un error).

Otro uso de setup.py es instalar un paquete desde el código fuente. Si un módulo está todavía en desarrollo, los archivos de wheel no estarán disponibles y la única forma de instalarlo es instalarlo desde el origen directamente.

Construyendo Python extensiones:

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

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

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

Cython:

Otro uso famoso de los archivos setup.py incluye extensiones compiladas. Estos requieren un script de instalación con valores definidos por el usuario. Permiten una ejecución rápida (pero una vez compilados son dependientes de la plataforma). He aquí un ejemplo sencillo 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 instalación es cx_Freeze. Esto convierte el script de Python a ejecutables. Esto permite que muchos comandos tales como descripciones, nombres, iconos, paquetes para incluir, excluir ect y una vez ejecutado producirá 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 archivo setup.py?

Simplemente es un script que construye o configura algo en el entorno Python.

Un paquete cuando se distribuye debe contener solo un script de instalación pero no es raro combinar varios juntos en un solo script de instalación. Note que esto a menudo implica distutils pero no siempre (como mostré en mi último ejemplo). Lo que hay que recordar es que configura el paquete/script de Python de alguna manera.

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

 0
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-14 00:31:10