python - for - upload to pypi
¿Podemos arrojar alguna luz definitiva sobre cómo funciona el empaquetado y la importación de Python? (4)
No creo que la import
deba ser explorada (la funcionalidad de creación de espacios e importación de Python es intuitiva en mi humilde opinión).
Uso pip
exclusivamente ahora. No me he encontrado ningún problema con eso.
Sin embargo, el tema del empaquetado y la distribución es algo que vale la pena explorar. En lugar de dar una respuesta larga, diré esto:
Aprendí a empaquetar y distribuir mis propios "paquetes" simplemente copiando cómo lo hacen Pylons u otros muchos paquetes de código abierto. Luego combiné ese tipo de plantilla con la lectura de los documentos para darle más detalle y obtuve un método de distribución sólido.
Cuando comprendes la administración y distribución de paquetes para python (distutils y pypi), en realidad es bastante poderoso. Me gusta mucho.
[editar]
También quería agregar un poco sobre virtualenv. ÚSELO. Creo un virtualenv para cada proyecto y siempre uso --no-site-packages
; Instalo todos los paquetes que necesito para ese proyecto en particular (incluso si es algo común entre todos ellos, como lxml
) dentro del virtualev. Mantiene todo aislado y es mucho más fácil para mí mantener la agrupación en mi cabeza (en lugar de tratar de hacer un seguimiento de qué es y para qué versión de Python!)
[/editar]
Tuve la oportunidad justa de superar la administración de módulos de Python, y cada vez es un desafío: el empaquetado no es lo que hace la gente todos los días, y se convierte en una carga de aprendizaje, y una carga para recordar, incluso cuando lo haces realmente , ya que esto sucede normalmente una vez.
Me gustaría recopilar aquí la descripción definitiva de cómo funciona la importación, la gestión de paquetes y la distribución en python, de modo que esta pregunta se convierta en la explicación definitiva de toda la magia que ocurre bajo el capó. Aunque entiendo el nivel general de la pregunta, estas cosas están tan entrelazadas que cualquier respuesta enfocada no resolverá el problema principal: comprender cómo funciona todo, qué está desactualizado, qué es lo actual, cuáles son solo alternativas para la misma tarea, cuáles son las peculiaridades
La lista de palabras clave para referirse es la siguiente, pero esto es solo una muestra del grupo. Hay mucho más y le invitamos a agregar detalles adicionales.
- PyPI
- setuptools / Distribute
- distutils
- huevos
- enlace de huevo
- pepita
- zipimport
- site.py
- paquetes de sitio
- .pth archivos
- virtualenv
- manejo de módulos compilados en huevos (con y sin instalación a través de easy_install)
- uso de get_data ()
- pypm
- bento
- PEP 376
- la tienda de queso
- eggsecutable
Vincularse a otras respuestas es probablemente una buena idea. Como dije, esta pregunta es para la descripción general de alto nivel.
Para la pregunta de empaque, esto debería ayudar a http://guide.python-distribute.org/
Para la importación, el viejo artículo de Fredrik Lundh http://effbot.org/zone/import-confusion.htm sigue siendo un muy buen punto de partida.
Recomiendo el Libro sobre Python de Tarek Ziadek. Hay un capítulo dedicado al empaque y la distribución.
En su mayor parte, este es un intento de mirar el lado del empaque / distribución, no la mecánica de la import
. Desafortunadamente, el empaque es el lugar donde Python ofrece más de una forma de hacerlo. Solo estoy tratando de ponerme en marcha, espero que otros ayuden a completar lo que extraño o señalar errores.
En primer lugar, hay una terminología desordenada aquí. Un directorio que contiene un archivo __init__.py
es un paquete. Sin embargo, la mayor parte de lo que estamos hablando aquí son versiones específicas de paquetes publicados en PyPI, uno de sus espejos o en un sistema de administración de paquetes específico del proveedor como Debt''s Apt, Redhat''s Yum, Fink, Macports, Homebrew o ActiveState''s pypm.
Estos paquetes publicados son lo que la gente intenta llamar "Distribuciones" en el futuro en un intento de usar "Paquete" solo como la construcción del lenguaje Python. Puede ver algo de ese uso en PEP-376 PEP-376 .
Ahora, su lista de palabras clave se relaciona con varios aspectos diferentes del Ecosistema Python:
Encontrar y publicar distribuciones de Python:
- PyPI (también conocido como la tienda de queso)
- Espejos PyPI
- Varias herramientas / sistemas de gestión de paquetes: apt, yum, fink, macports, homebrew
- pypm (alternativa de ActiveState a PyPI)
Lo anterior son todos los servicios que proporcionan un lugar para publicar distribuciones de Python en varios formatos. Algunos, como los espejos PyPI y los repositorios apt / yum, pueden ejecutarse en su máquina local o dentro de la red de su empresa, pero la gente normalmente usa los oficiales. La mayoría, si no todos, proporcionan una herramienta (o múltiples herramientas en el caso de PyPI) para ayudar a encontrar y descargar distribuciones.
Bibliotecas usadas para crear e instalar distribuciones:
-
setuptools
/ Distribute -
distutils
Distutils es la infraestructura estándar en la que los paquetes de Python se compilan y se integran en las distribuciones. Hay un montón de funcionalidades en distutils
pero la mayoría de la gente simplemente sabe:
from distutils.core import setup
setup(name=''Distutils'',
version=''1.0'',
description=''Python Distribution Utilities'',
author=''Greg Ward'',
author_email=''[email protected]'',
url=''http://www.python.org/sigs/distutils-sig/'',
packages=[''distutils'', ''distutils.command''],
)
Y hasta cierto punto, eso es lo que necesitas. Con las 9 líneas anteriores de código tiene suficiente información para instalar un paquete Python puro y también los metadatos mínimos necesarios para publicar ese paquete en una distribución en PyPI.
Setuptools proporciona los ganchos necesarios para admitir el formato Egg y todas sus características y debilidades. Distribuir es una alternativa a las herramientas de configuración que agrega algunas características al tratar de ser principalmente compatible con versiones anteriores. Creo que Distribute se incluirá en Python 3 como el sucesor de Distutti de la from distutils.core import setup
.
Tanto Setuptools como Distribute proporcionan una versión personalizada del comando de configuración de distutils
que hace cosas útiles, como el formato Egg.
Formatos de distribución Python:
- fuente
- eggs
Las distribuciones se suelen proporcionar como archivos de origen (tarball o zipfile). La forma estándar de instalar una distribución de origen es descargando y descomprimiendo el archivo y luego ejecutando el archivo setup.py
dentro.
Por ejemplo, lo siguiente descargará, compilará e instalará la biblioteca de resaltado de sintaxis de Pygments:
curl -O -G http://pypi.python.org/packages/source/P/Pygments/Pygments-1.4.tar.gz
tar -zxvf Pygments-1.4.tar.gz
cd Pygments-1.4
python setup.py build
sudo python setup.py install
Alternativamente, puede descargar el archivo Egg e instalarlo. Por lo general, esto se logra mediante el uso de easy_install o pip:
sudo easy_install pygments
or
sudo pip install pygments
eggs fueron inspirados por Jarfiles de Java y tienen bastantes características que deberías leer eggs
Formatos de paquete Python:
- directorios sin comprimir
- zipimport (directorios zip comprimidos)
Un paquete python normal es solo un directorio que contiene un archivo __init__.py
y una cantidad arbitraria de módulos o __init__.py
adicionales. Python también tiene soporte para encontrar y cargar código fuente dentro de archivos * .zip, siempre y cuando estén incluidos en PYTHONPATH
( sys.path
).
Instalar paquetes de Python:
-
easy_install
: la herramienta de instalación del huevo original, depende de las herramientas desetuptools
-
pip
: actualmente la forma más popular de instalar paquetes de Python. Similar aeasy_install
pero más flexible y tiene algunas característicaseasy_install
, como archivos de requisitos para ayudar a documentar las dependencias y reproducir implementaciones. -
pypm
,apt
,yum
, fink, etc.
Gestión del entorno / Despliegue automatizado:
-
bento
-
buildout
-
virtualenv
(yvirtualenvwrapper
)
Las herramientas anteriores se utilizan para ayudar a automatizar y administrar dependencias para un proyecto de Python. Básicamente, le brindan herramientas para describir qué distribuciones requiere su aplicación y automatizar la instalación de esas versiones específicas de sus dependencias.
Ubicaciones de paquetes / distribuciones:
- paquetes de sitio
-
PYTHONPATH
- el directorio de trabajo actual (depende de su sistema operativo y la configuración del entorno)
Por defecto, la instalación de una distribución de python va a colocarlo en el directorio site-packages. Ese directorio suele ser algo así como /usr/lib/pythonX.Y/site-packages
.
Una forma simple y programática para encontrar su directorio de paquetes de sitio:
from distuils import sysconfig
print sysconfig.get_python_lib()
Formas de modificar su PYTHONPATH:
La declaración de importación de Python solo encontrará los paquetes que se encuentran en uno de los directorios incluidos en su PYTHONPATH
.
Puede inspeccionar y cambiar su ruta desde dentro de Python al acceder a:
import sys
print sys.path
sys.path.append("/home/myname/lib")
Además de eso, puede establecer la variable de entorno PYTHONPATH
como lo haría con cualquier otra variable de entorno en su sistema operativo o podría usar:
- Archivos .pth: los archivos .pth ubicados en los directorios que ya están en su
PYTHONPATH
se leen y cada línea del archivo * .pth se agrega a suPYTHONPATH
. Básicamente, cada vez que copie un paquete en un directorio en suPYTHONPATH
podría crear unmypackages.pth
. Lea más acerca de los archivos * .pth: módulo de sitio - archivos de enlace de huevo: estructura interna de los huevos de pitón son una alternativa de plataforma cruzada a enlaces simbólicos. Crear un archivo de enlace de huevo es similar a crear un archivo pth.
- modificaciones
site.py
Para agregar el /home/myname/lib
a site-packages con un archivo * .pth, crearía un archivo * .pth. El nombre del archivo no importa, pero aún debes elegir algo sensato.
Vamos a crear myname.pth
:
# myname.pth
/home/myname/lib
Eso es. Suelte eso en sysconfig.get_python_lib()
en su sistema o en cualquier otro directorio en su PYTHONPATH
y /home/myname/lib
se agregará a la ruta.