¿Alguien puede explicar qué setup.py
es y cómo se puede configurar o usar?
¿Alguien puede explicar qué setup.py
es y cómo se puede configurar o usar?
Respuestas:
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 .
pip
usará setup.py para instalar su módulo. Evita llamar setup.py
directamente.
https://docs.python.org/3/installing/index.html#installing-index
setup.py
archivo.
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 las indicaciones de [I] Python.
Hace el trabajo similar de pip
, easy_install
etc.,
Utilizando setup.py
Comencemos con algunas definiciones:
Paquete : una carpeta / directorio que contiene el __init__.py
archivo.
Módulo : un archivo Python válido con .py
extensió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.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, su 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',
]
)
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='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',
]
)
Se long_description
utiliza 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.py
de un proyecto real aquí:torchvision-setup.py
requests
) tiene este proyecto para dar explícitamente un buen ejemplo de setup.py - github.com/kennethreitz/setup.py
setup.py
es la respuesta de Python a un instalador y make
archivo multiplataforma .
Si está familiarizado con las instalaciones de línea de comandos, entonces se make && make install
traduce 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 gcc
o cl
) y un módulo de interfaz de Python (como swig
o pyrex
).
python setup.py install
en realidad se ejecuta python setup.py build
primero (por lo que no necesita ejecutarlos por separado a menos que en casos específicos). Creo que make
siempre debe ejecutarse manualmente antes de ejecutarse make install
.
make
no requiere ningún parámetro específico (u orden): depende completamente del creador de Makefile
qué "objetivos" están disponibles (y en qué orden deben invocarse). Dado que los bare ( Makefile
s) 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 make
antes make install
o no.
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é es útil este archivo, consulte la documentación de Python al escribir el Script de configuración
setup.py
es 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 distutils
framework en conjunción con setup.py
.
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
python setup.py --help-commands
. Muy útil al cavar en el setup.py.
Cuando descargue un paquete con setup.py
abra 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!
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.py
es 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.
setup.py
es un archivo de Python como cualquier otro. Puede tomar cualquier nombre, excepto por convención, se nombra setup.py
para que no haya un procedimiento diferente con cada script.
Con mayor frecuencia setup.py
se 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.py
es en módulos. Aunque se pueden instalar usando pip
, las versiones antiguas de Python no se incluyen pip
por 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.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, descargar la fuente y ejecutarla python setup.py install
realizarí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.py
es 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.py
por su facilidad de uso y por convención, pero puede tomar cualquier nombre.
Cython:
Otro uso famoso de setup.py
archivos 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.py
archivo?
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 distutils
pero 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.
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.
Las siguientes dos secciones analizan 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 ... 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/",]
En un mundo ideal, setuptools.setup
manejarí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 .