¿Cómo puedo obtener la versión definida en setup.py (setuptools) en mi paquete?

Resuelto elmarco asked hace 14 años • 21 respuestas

¿ Cómo puedo obtener la versión definida setup.pydesde mi paquete (para --versionfines u otros)?

elmarco avatar Jan 14 '10 00:01 elmarco
Aceptado

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.

PJ Eby avatar Jan 15 '2010 17:01 PJ Eby

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.pyse 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 mymoduledurante la configuración

Si setup.pyimporta 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.pyposible 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, importpuede obtener el problema n.° 1.

solución: a lasetuptools

Usaría una combinación de openy execproporcionaría un dictado para execagregar 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.pyexponer 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).

dnozay avatar Jul 01 '2014 18:07 dnozay