¿Cómo puedo obtener la versión definida en setup.py (setuptools) en mi paquete?
¿ Cómo puedo obtener la versión definida setup.py
desde mi paquete (para --version
fines u otros)?
Interrogar cadena de versión de distribución ya instalada
Para recuperar la versión desde dentro de su paquete en tiempo de ejecución (lo que su pregunta parece ser realmente), puede usar:
import pkg_resources # part of setuptools
version = pkg_resources.require("MyProject")[0].version
Cadena de versión de la tienda para usar durante la instalación
Si desea ir al revés (que parece ser lo que otros autores de respuestas aquí parecen haber pensado que estaba preguntando), coloque la cadena de versión en un archivo separado y lea el contenido de ese archivo en formato setup.py
.
Puede crear un version.py en su paquete con una __version__
línea y luego leerlo desde setup.py usando execfile('mypackage/version.py')
, para que se establezca __version__
en el espacio de nombres setup.py.
Advertencia sobre la condición de carrera durante la instalación
Por cierto, NO importe su paquete desde setup.py como se sugiere en otra respuesta aquí: parecerá funcionar para usted (porque ya tiene instaladas las dependencias de su paquete), pero causará estragos en los nuevos usuarios de su paquete. , ya que no podrán instalar su paquete sin instalar primero manualmente las dependencias.
estudio de ejemplo:mymodule
Imagina esta configuración:
setup.py
mymodule/
/ __init__.py
/ version.py
/ myclasses.py
Luego imagina un escenario habitual en el que tienes dependencias y setup.py
se ve así:
setup(...
install_requires=['dep1','dep2', ...]
...)
Y un ejemplo __init__.py
:
from mymodule.myclasses import *
from mymodule.version import __version__
Y por ejemplo myclasses.py
:
# these are not installed on your system.
# importing mymodule.myclasses would give ImportError
import dep1
import dep2
Problema n.º 1: importar mymodule
durante la configuración
Si setup.py
importa mymodule
, durante la configuración lo más probable es que obtenga un archivo ImportError
. Este es un error muy común cuando su paquete tiene dependencias. Si su paquete no tiene otras dependencias además de las incorporadas, puede estar seguro; sin embargo, esta no es una buena práctica. La razón es que no está preparado para el futuro; digamos que mañana su código necesita consumir alguna otra dependencia.
Problema #2: ¿dónde está mi __version__
?
Si lo codifica, __version__
es setup.py
posible que no coincida con la versión que enviaría en su módulo. Para ser coherente, deberá colocarlo en un lugar y leerlo desde el mismo lugar cuando lo necesite. Al usarlo, import
puede obtener el problema n.° 1.
solución: a lasetuptools
Usaría una combinación de open
y exec
proporcionaría un dictado para exec
agregar variables:
# setup.py
from setuptools import setup, find_packages
from distutils.util import convert_path
main_ns = {}
ver_path = convert_path('mymodule/version.py')
with open(ver_path) as ver_file:
exec(ver_file.read(), main_ns)
setup(...,
version=main_ns['__version__'],
...)
Y en mymodule/version.py
exponer la versión:
__version__ = 'some.semantic.version'
De esta manera, la versión se envía con el módulo y no tendrá problemas durante la instalación al intentar importar un módulo al que le faltan dependencias (aún por instalar).