¿Alguien puede explicar, qué es setup.py
y cómo se puede configurar o usar?
¿Alguien puede explicar, qué es setup.py
y cómo se puede configurar o usar?
setup.py
es un archivo python, que generalmente le informa que el módulo / paquete que está a punto de instalar se ha empaquetado y distribuido con Distutils, que es el estándar para distribuir los módulos de Python.
Esto le permite instalar fácilmente paquetes de Python. A menudo es suficiente para escribir:
$ python setup.py install
y el módulo se instalará solo.
Ayuda a instalar un paquete de 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] instrucciones de Python.
Hace el trabajo similar de pip
, easy_install
etc.,
Utilizando setup.py
Comencemos con algunas definiciones:
Paquete - Una carpeta / directorio que contiene __init__.py
archivo.
Módulo - Un archivo python válido con .py
extensión.
Distribución - Como uno paquete se relaciona con otros paquetes y módulos.
Digamos que quiere 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 desea utilizarlo. Entonces hazlo,
$ python setup.py develop
Este comando creará enlaces simbólicos al directorio de origen dentro de site-packages en lugar de copiar cosas. Debido a esto, es bastante rápido (particularmente para paquetes grandes).
Creando setup.py
Si tienes el árbol de tu paquete,
foo
├── foo
│ ├── data_struct.py
│ ├── __init__.py
│ └── internals.py
├── README
├── requirements.txt
└── setup.py
Entonces, haces lo siguiente en tu setup.py
script 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='foomail@foo.com',
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 tu setup.py
en este caso sería como:
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',
]
)
Agrega más cosas a (setup.py
) y hacerlo 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',
]
)
los long_description
se usa en pypi.org como la descripción README de tu paquete.
Y finalmente, ahora estás listo para subir tu paquete a PyPi.org para que otros puedan instalar su paquete usando pip install yourpackage
.
El primer paso es reclamar el nombre y el espacio de tu paquete en pypi usando:
$ python setup.py register
Una vez que se registra el nombre de su paquete, nadie puede reclamarlo ni usarlo. Después de un registro exitoso, debe subir su paquete allí (a la nube) cerca,
$ python setup.py upload
Opcionalmente, también puede firmar su paquete con GPG
por,
$ python setup.py --sign upload
Prima: Ver una muestra setup.py
de un proyecto real aquí: torchvision-setup.py
setup.py
es la respuesta de Python a un instalador multiplataforma y make
archivo.
Si está familiarizado con las instalaciones de línea de comando, entonces make && make install
se traduce a python setup.py build && python setup.py install
.
Algunos paquetes son puros de Python, y solo se compilan en bytes. Otros pueden contener código nativo, que requerirá un compilador nativo (como gcc
o cl
) y un módulo de interfaz de Python (como swig
o pyrex
)
Si descargó 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é sirve este archivo, consulte Documentación de Python sobre cómo escribir el script de instalación
setup.py
es un script de Python que generalmente se envía con bibliotecas o programas, escritos en ese idioma. Su propósito es la correcta instalación del software.
Muchos paquetes usan el distutils
marco en conjunción con setup.py
.
setup.py se puede utilizar 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 de Python, estos tres archivos determinarán el nombre (contenido en PKG-INFO bajo la carpeta de información del huevo), la versión, la descripción, otras instalaciones necesarias (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 puedes definir qué se debe incluir en tu 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
Cuando descargas un paquete con setup.py
abra su Terminal (Mac, Linux) o Símbolo del sistema (Windows). Utilizando cd
y ayudándote con el botón Tabulador, establece el camino correcto a la carpeta donde has descargado el archivo y donde hay setup.py
:
iMac:~ user $ cd path/pakagefolderwithsetupfile/
Presiona intro, deberías ver algo como esto:
iMac:pakagefolderwithsetupfile user$
Luego escribe después de esto python setup.py install
:
iMac:pakagefolderwithsetupfile user$ python setup.py install
prensa enter
. ¡Hecho!
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 apuntar a un administrador de paquetes en la descarga, como lo haría uno en Ruby y Nodejs, por ej. gem install rails-4.1.1.gem
Un administrador de paquetes también se siente 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 que 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 digo que el flujo de trabajo de setup.py sea menos seguro que el administrador de paquetes (entiendo que Pip solo ejecuta el setup.py dentro), pero ciertamente siento que es incómodo y discordante. Hay una armonía en todos los comandos para la misma aplicación de administrador de paquetes. Puede que incluso te guste.
Para hacerlo simple, setup.py se ejecuta como "__main__"
cuando llamas al instalar funciones las otras respuestas mencionadas. Dentro de setup.py, debe colocar todo lo necesario para instalar su paquete.
Las siguientes dos secciones discuten dos cosas que tienen muchos módulos setup.py.
Esta función le permite especificar atributos del proyecto como el nombre del proyecto, la versión .... Más importante aún, esta función le permite instalar otras funciones si están bien empaquetadas. Ver esta página web para un ejemplo de setuptools.setup
Estos atributos de setuptools.setup permiten instalar estos tipos de paquetes:
Paquetes que se importan a su proyecto y se enumeran en PyPI utilizando setuptools.findpackages:
packages = find_packages (exclude = ["docs", "tests", ".gitignore", "README.rst", "DESCRIPTION.rst"])
Paquetes no en PyPI, pero se puede descargar desde una URL usando dependency_links
dependency_links = ["http://peak.telecommunity.com/snapshots/",]
En un mundo ideal, setuptools.setup
manejaría todo por ti. Lamentablemente, 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. Intente evitar esto, estas funciones se vuelven confusas y, a menudo, difieren entre OS e incluso distribución.
setup.py
es un archivo de Python como cualquier otro. Puede tomar cualquier nombre, excepto 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
está en módulos. Aunque se pueden instalar usando pip
, las versiones antiguas de Python no incluían pip
por defecto y necesitaban instalarse por separado.
Si desea instalar un módulo pero no desea instalarlo pip
, la única alternativa era instalar el módulo 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 usa a menudo cuando pip
fallará. Por ejemplo, si la versión correcta de Python del paquete deseado no está disponible a través de pip
quizás porque ya no se mantiene, descargando la fuente y ejecutándose 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 la fuente. Si un módulo todavía está en desarrollo, los archivos de ruedas 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 pueden ser instalados usando el comando de arriba.
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
(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 setup.py
los archivos incluyen extensiones compiladas Estos requieren una secuencia de comandos de configuración con valores definidos por el usuario. Permiten la ejecución rápida (pero una vez compilada depende de la plataforma). Aquí hay un ejemplo simple de 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 la secuencia de comandos de Python en ejecutables. Esto permite que muchos comandos como descripciones, nombres, iconos, paquetes incluyan, excluya ect y una vez que se ejecute producirá una aplicación distribuible. Un ejemplo de 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.py
¿archivo?
Simplemente, es un script que crea o configura algo en el entorno de Python.
Un paquete cuando se distribuye debe contener solo un script de configuración, pero no es raro combinar varios en un solo script de configuración. Observe que esto a menudo involucra distutils
pero no siempre (como lo mostré en mi último ejemplo). Lo que hay que recordar es que simplemente configura el paquete / script de Python de alguna manera.
Toma el nombre para que siempre se pueda usar el mismo comando al construir o instalar.