2011-10-03 11 views
11

Tengo un proyecto de Python 2 ('foo 0.1.7') que requiere Python 2.4 o posterior.¿Cuál es la mejor forma de distribuir un paquete de Python que requiere una versión mínima de Python?

Ahora lo porté a Python 3 ('foo 0.2.0') de una manera que todavía es compatible con Python 2, pero los requisitos ahora se levantan a Python 2.6 o posterior.

  • sé que hay una opción para --target-version=2.6 setup.py, que puede ser utilizado con upload, pero eso no parece referirse como '2.6 o superior'
  • El comando setup tiene una opción install_requires, pero esto es para los paquetes requeridos, no para el intérprete de Python.

que podía hacer algo como esto en setup.py de 'foo 0.2.0':

if sys.hexversion < 0x02060000: 
    raise RuntimeError('This package requires Python 2.6 or later, try foo 0.1.7') 

pero preferiría si easy_install foo podría resolver esto de alguna manera.

Entonces, ¿cómo debo implementar esto en PyPI?

Respuesta

2

Lo que parece que está buscando es una manera de cargar la versión 0.1.7 y 0.2.0 de su programa, y ​​tener easy_install-2.5 automáticamente use 0.1.7, mientras que easy_install-2.6 usaría 0.2. 0.

Si ese es el caso, no estoy seguro de si es posible hacerlo con el sistema actual ... el cheque raise RuntimeError() podría ser la mejor opción actualmente disponible; las personas que instalan su proyecto tendrían que hacerlo manualmente easy_install-2.5 -U "proj<0.2", o algo similar.

Dicho esto, hay un grupo dedicado actualmente trabajando para reemplazar distutils, setuptools, etc. con una biblioteca actualizada llamada packaging. Esta nueva biblioteca combina las características de las bibliotecas de mejora de distutils existentes, así como una serie de otras mejoras. Está programado para su inclusión en Python 3.3, y luego para ser backported como distutils2.

De especial relevancia para su pregunta, contiene muchas mejoras en los metadatos de configuración; incluyendo una opción "requires_python", que parece hecha a medida para indicar exactamente la información que desea. Sin embargo, no estoy seguro de cómo planean hacer uso de esta información, y si hará que el nuevo sistema de instalación se comporte como usted quería.

Yo había recomendado publicar en the fellowship of the packaging, el grupo de google dedicado al desarrollo del nuevo sistema, podrían dar detalles sobre cómo se espera que funcione requires_python ... y posiblemente obtener el comportamiento de instalación que desea en en la planta baja del nuevo sistema si parece factible (y no está ya allí).

4

Sé que hay un --target-version = 2.6 opción para setup.py, que se puede utilizar con cargados, pero eso no parece referirse como '2.6 o superior'

En realidad es una opción para bdist_wininst o bdist_msi, y de hecho no incluye "o superior".

El comando de instalación tiene una opción install_requires, pero esto es para los paquetes requeridos , .not intérprete de Python.

Tal vez poniendo 'Python> = 2.6' en install_requires podrían trabajar: Python 2.5 hasta 3.2 Crear un archivo de Python-blahblah-pyXY.egg-información, por lo que si tiene suerte easy_install pueden encontrar que el requisito es satisfecho. Si no es así, probablemente intentará descargar desde PyPI, por lo que eh ...

que podía hacer algo como esto en setup.py de 'foo 0.2.0': si sys.hexversion < 0x02060000: aumento RuntimeError ('Este paquete requiere Python 2.6 o posterior, pruebe foo 0.1.7')

Este es en realidad el idioma común actual. Además, el uso de los clasificadores de "Programming Language :: Python :: X.Y" troves dará información para humanos (no conozco ninguna herramienta que use esa información).

En el futuro a corto plazo, hay esperanza. La especificación para los metadatos de distribución de Python se ha actualizado y la última versión contiene un campo para requerir una versión específica de Python: http://www.python.org/dev/peps/pep-0345/#requires-python

Con respecto al soporte de la herramienta: distutils está congelado y no lo admite, las herramientas de configuración pueden o no agregar soporte, su distribución de horquillas probablemente obtendrá soporte, y el empaquetado de distutils2 ya lo soporta. distutils2 incluye un instalador básico llamado pysetup, que debe respetar el campo Requires-Python (si no, informe a bugs.python.org).

Ahora, para hacer frente a su problema en este momento, se puede hacer una de estas cosas: - declara que su proyecto sólo es compatible con 2.6+ - 2,4 documento que los usuarios necesitan para fijar la versión al descargar (por ejemplo, pip instalar "foo == 0.1.7 ")

+0

+1 para obtener esta respuesta detallada, ¡gracias! – mar10

Cuestiones relacionadas