Documentos de Académico
Documentos de Profesional
Documentos de Cultura
html
Una «distribución compilada» es lo que probablemente conoce como un «paquete binario» o un «instalador»
(dependiendo de sus antecedentes). No es necesariamente binario, sin embargo, porque podría contener sólo
código fuente de Python o código de bytes; y no lo llamamos paquete, porque esa palabra ya existe en Python.
(E «instalador» es un término específico para el mundo de los sistemas de escritorio convencionales.)
Una distribución compilada es la forma de hacer la vida lo más fácil posible para los instaladores de la distribu-
ción de módulos: para los usuarios de sistemas Linux basados en RPM, es un RPM binario; para los usuarios
de Windows, es un instalador ejecutable; para los usuarios de Linux basados en Debian, es un paquete Debian;
y así sucesivamente. Obviamente, ninguna persona podrá crear distribuciones compiladas para cada plataforma
existente, por lo que los Distutils están diseñados para permitir que los desarrolladores de módulos se concen-
tren en su especialidad—escribir código y crear distribuciones de fuentes—mientras una especie intermedia lla-
mada empaquetadores surge para convertir las distribuciones de fuentes en distribuciones compiladas para tan-
tas plataformas como empaquetadores.
Por supuesto, el desarrollador del módulo podría ser su propio empaquetador; o el empaquetador podría ser un
voluntario «por ahí» en algún lugar que tenga acceso a una plataforma a la que el desarrollador original no tie-
ne; o podría ser software que periódicamente obtiene nuevas distribuciones de fuentes y las convierte en distri-
buciones compiladas para tantas plataformas como el software tenga acceso. Independientemente de quiénes
sean, un empaquetador utiliza el script de configuración y la familia de comandos bdist para generar distribucio-
nes compiladas.
1 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
a continuación, Distutils crea mi distribución de módulos (el propio Distutils en este caso), realiza una instalación
«falsa» (también en el directorio build ) y crea el tipo predeterminado de distribución compilada para mi plata-
forma. El formato predeterminado para las distribuciones compiladas es un archivo tar «dumb» en Unix, y un
simple instalador ejecutable en Windows. (Ese archivo tar se considera «dumb» porque tiene que ser desempa-
quetado en una ubicación específica para funcionar.)
Por lo tanto, el comando anterior en un sistema Unix crea Distutils-1.0.plat.tar.gz ; desempaquetar es-
te tarball desde el lugar correcto instala el Distutils como si hubiera descargado la distribución de fuentes y eje-
cutado python setup.py install . (El «lugar correcto» es la raíz del sistema de ficheros o del directorio
prefix de Python, dependiendo de las opciones dadas al comando bdist_dumb; por defecto se realizan distri-
buciones dumb relativas a prefix .)
Obviamente, para distribuciones puras de Python, esto es tan simple como ejecutar python setup.py
install —pero para distribuciones no puras, que incluyen extensiones que tendrían que ser compiladas, puede
significar la diferencia entre alguien que puede usar sus extensiones o no. Y crear distribuciones compiladas
«inteligentes», como un paquete RPM o un instalador ejecutable para Windows, es mucho más conveniente pa-
ra los usuarios, incluso si su distribución no incluye ninguna extensión.
El comando bdist tiene una opción --formats , similar al comando sdist, que puede utilizar para seleccionar
los tipos de distribución compilada a generar: por ejemplo,
cuando se ejecuta en un sistema Unix, crearía Distutils-1.0.plat.zip —de nuevo, este archivo sería des-
empaquetado desde el directorio raíz para instalar Distutils.
2 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
Notas:
1. predeterminado en Unix
2. predeterminado en Windows
3. requiere utilidad externa compress .
4. requiere o bien la utilidad externa zip o bien el módulo zipfile (parte de la librería estándar de Python
desde Python 1.6)
5. requiere la utilidad externa rpm, versión 3.0.4 o mejor (usar rpm --version para descubrir que versión
tiene)
No tiene que usar el comando bdist con la opción --formats ; también puede usar el comando que directa-
mente implementa el formato en el que esté interesado. Algunos de estos bdist «sub-commands» de hecho ge-
neran varios formatos similares; por ejemplo, el comando bdist_dumb genera todos los formatos de archivo
«dumb» ( tar , gztar , bztar , xztar , ztar , y zip ), y bdist_rpm genera tanto binario como fuentes RPMs.
Los subcomandos bdist, y los formatos generados por cada uno, son:
3 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
Comando Formatos
bdist_wininst wininst
bdist_msi msi
Las siguientes secciones proporcionan detalles sobre los comandos individuales de bdist_* .
El forma más común de crear un RPM de su distribución de módulo es ejecutar el comando bdist_rpm
El primero permite especificar las opciones específicas de RPM; el segundo permite especificar fácilmente va-
rios formatos en una ejecución. Si necesita hacer los dos, se pueden especificar explícitamente múltiples co-
4 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
La creación de paquetes RPM es impulsada por un archivo .spec , al igual que el uso de Distutils es impulsado
por el script de configuración. Para hacer su vida más fácil, el comando bdist_rpm normalmente crea un archivo
.spec basado en la información que usted proporciona en el script de configuración, en la línea de comandos y
en cualquier archivo de configuración de Distutils. Varias opciones y secciones en el archivo .spec se derivan
de las opciones del script de configuración de la siguiente manera:
Opción de archivo RPM .spec o sección Opción del script de instalación de Distutils
Nombre name
Versión version
Copyright license
Url url
Adicionalmente, hay muchas opciones en los archivos .spec que no se corresponden a opciones en el script
de configuración. La mayoría de éstas están manejadas a través de opciones al comando bdist_rpm como si-
gue:
5 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
Obviamente, proporcionar incluso algunas de estas opciones en la línea de comandos sería tedioso y propenso
a errores, por lo que generalmente es mejor ponerlas en el archivo de configuración de instalación,:file:se-
tup.cfg— ver sección Writing the Setup Configuration File. Si distribuye o empaqueta muchas distribuciones de
módulos de Python, es posible que desee incluir opciones que se apliquen a todas ellas en su archivo de confi-
guración personal de Distutils ( ~/.pydistutils.cfg ). Si desea deshabilitar temporalmente este archivo, pue-
de pasar la opción --no-user-cfg a setup.py .
Hay tres pasos para construir un paquete RPM binario, los cuales son manejados automáticamente por Distutils:
1. crear un archivo .spec . que describe el paquete (análogo al script de configuración de Distutils; de hecho,
gran parte de la información en el script de configuración termina en el fichero .spec )
2. crear el fuente RPM
3. crear el «binario» RPM (que puede o no contener código binario, dependiendo de si la distribución de su
módulo contiene extensiones Python)
6 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
Normalmente, RPM agrupa los dos últimos pasos; cuando usa las Distutils, los tres pasos generalmente están
agrupados.
Si lo desea, puede separar estos tres pasos. Puede usar la opción --spec-only para hacer bdist_rpm simple-
mente cree el archivo .spec y salga; en este caso, el archivo .spec se escribirá en el «directorio de distribu-
ción»— normalmente dist/ , pero se puede personalizar con la opción --dist-dir . (Normalmente, el archivo
.spec termina en lo más profundo del «árbol de compilación», en un directorio temporal creado por
bdist_rpm.)
Los instaladores ejecutables son el formato natural para distribuciones binarias en Windows. Muestran una
agradable interfaz gráfica de usuario, con información sobre la distribución del módulo que se instalará extraída
de los metadatos en el script de configuración, permiten al usuario seleccionar algunas opciones e iniciar o can-
celar la instalación.
Dado que los metadatos se toman del script de configuración, crear instaladores de Windows suele ser tan fácil
como ejecutar:
Si tiene una distribución de módulo pura (sólo conteniendo módulos de Python puros y paquetes), el instalador
resultante será independiente de la versión y tendrá un nombre similar a foo-1.0.win32.exe . Tenga en cuen-
ta que crear distribuciones binarias wininst sólo se soporta en sistemas Windows.
7 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
Si tiene distribuciones no puras, las extensiones sólo se pueden crear en una plataforma Windows, y serán de-
pendientes de la versión de Python. El nombre de archivo del instalador reflejará esto y ahora tiene la forma
foo-1.0.win32-py2.0.exe . Debe crear un instalador separado para cada versión de Python que se quiera
soportar.
El instalador intentará compilar módulos puros en bytecode después de la instalación en el sistema de destino
en modo normal y optimizado. Si no desea que esto suceda por alguna razón, puede ejecutar el comando
bdist_wininst con la opción --no-target-compile o la opción --no-target-optimize .
Por defecto, el instalador mostrará el genial logo «Python Powered» cuando se ejecute, pero puede también
proporcionar su propio mapa de bits de 152x261 que debe ser un archivo Windows .bmp con la opción
--bitmap .
El instalador también mostrará un título grande en la pantalla de fondo del escritorio cuando se ejecute, que se
construye a partir del nombre de su distribución y el número de versión. Esto se puede cambiar a otro texto
usando la opción --title .
Para compilar para una plataforma alternativa, especifique la opción --plat-name del comando de compila-
ción. Los valores válidos son actualmente “win32”, y “win-amd64”. Por ejemplo, en una versión de Windows de
32bit, puede ejecutar:
8 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
para crear una versión de 64bit de su extensión. Los instaladores de Windows también admiten esta opción, por
lo que el comando:
Para realizar una compilación cruzada, debe descargar el código fuente de Python y compilar el propio Python
para la plataforma a la que se dirige; no es posible desde una instalación binaria de Python (ya que el archivo
.lib etc para otras plataformas no está incluido). En la práctica, esto significa que el usuario de un sistema opera-
tivo de 32bit necesitará usar Visual Studio 2008 para abrir la solución PCbuild/PCbuild.sln en el árbol de
código de Python y construir la configuración » x64 » del proyecto “pythoncore” antes de que sea posible la
compilación cruzada de extensiones.
Tenga en cuenta que, de forma predeterminada, Visual Studio 2008 no instala compiladores o herramientas de
64bit. Es posible que deba volver a ejecutar el proceso de instalación de Visual Studio y seleccionar estas herra-
mientas (usar Panel de control -> [Agregar/Quitar] Programas es una forma conveniente de verificar o modificar
su instalación existente).
A partir de Python 2.3, se puede especificar un script posterior a la instalación con la opción --install-
script . Se debe especificar el nombre base del script y el nombre del archivo del script también se debe in-
cluir en el argumento de los scripts de la función de configuración.
Este script se ejecutará en el momento de la instalación en el sistema de destino después de que se hayan co-
piado todos los archivos, con argv[1] establecido en -install , y nuevamente en el momento de la desinsta-
lación antes de que se eliminen los archivos con argv[1] establecido en -remove .
Algunas funciones especialmente útiles en este contexto están disponibles como funciones integradas adiciona-
9 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
directory_created(path)
file_created(path)
Estas funciones deben llamarse cuando el script posterior a la instalación crea un directorio o archivo en el
momento de la instalación. Registrará path con el des-instalador, de modo que se eliminará cuando se des-
instale la distribución. Para mayor seguridad, los directorios solo se eliminan si están vacíos.
get_special_folder_path(csidl_string)
Esta función se puede utilizar para recuperar ubicaciones de directorios especiales en Windows como el
menú Inicio o el escritorio. Retorna la ruta completa al directorio. csidl_string debe ser una de las siguientes
cadenas:
"CSIDL_APPDATA"
"CSIDL_COMMON_STARTMENU"
"CSIDL_STARTMENU"
"CSIDL_COMMON_DESKTOPDIRECTORY"
"CSIDL_DESKTOPDIRECTORY"
"CSIDL_COMMON_STARTUP"
"CSIDL_STARTUP"
"CSIDL_COMMON_PROGRAMS"
"CSIDL_PROGRAMS"
"CSIDL_FONTS"
Los directorios disponibles dependen de la versión exacta de Windows y probablemente también de la con-
figuración. Para obtener más información, consulte la documentación de Microsoft de la función
SHGetSpecialFolderPath() .
10 de 11 07/05/2021 08:08 a. m.
5. Crear distribuciones compiladas — documentación de Python - 3.9.5 https://docs.python.org/es/3/distutils/builtdist.html
11 de 11 07/05/2021 08:08 a. m.