2009-12-18 13 views
6

Tengo un proyecto de Python con módulos de extensión mutiple escritos en C, que hablan con una biblioteca de terceros. Sin embargo, dependiendo del entorno y las opciones del usuario, algunos módulos no deberían construirse, y algunos indicadores del compilador deberían habilitarse/deshabilitarse. El problema es que tengo que compilar la lista de módulos de extensión antes de llamar a setup(), e idealmente me gustaría usar una subclase distutils.Command para manejar las opciones del usuario. Ahora mismo tengo algunas opciones:Configurar módulos de extensión con distutils/setuptools

  1. requieren un comando "python setup.py configurar" se ejecute antes de construir los módulos, almacenar la información en un archivo de salmuera, y lo utilizan para generar la lista de extensiones próxima vez la secuencia de comandos se ejecuta. Así es como funciona actualmente mi proyecto, lo que parece bastante tonto.

  2. Elimine manualmente las opciones de sys.argv y úselos para compilar la lista. Esta no es una solución a largo plazo porque eventualmente querré ejecutar algunos scripts para verificar la configuración antes de construir.

  3. Subclase build_ext desde distutils, hago mi configuración al principio del método run() (posiblemente también usando opciones enviadas por (2)) y modifico directamente self.distribution.ext_modules antes de construir. Me temo que esto puede confundir setuptools, sin embargo, ya que puede suponer que la lista de módulos de extensión es fija cuando se llama a setup(). También significa que cuando se llama a setup() con un comando que no sea build_ext, la lista de módulos de extensión está vacía.

¿Hay alguna manera de hacerlo?

Respuesta

0

Mi propia experiencia con el cambio de distutils ha sido débil y inestable, por lo que todo lo que puedo ofrecer son consejos. Echa un vistazo a Numpy. Eso tiene un submódulo completo (numpy.distutils) con formas de trabajar con (distutils). De lo contrario, consulte la lista de correo de distutils.

0

Me subclase distutils.core.Distribution y pasarlo con distutils.core.setup(distclass=CustomDistribution) - esto le da acceso a los parámetros de línea de comandos de la misma manera que la configuración normal de ellos tiene, y se pueden hacer cosas como el ajuste de la lista de extensiones en el método CustomDistribution.__init__. Pero estoy de acuerdo con Dalke, el camino de distutils está lleno de dolor ...

1

¿Hay alguna manera de hacerlo?

Según mi experiencia trabajando con módulos de otras personas, puedo decir que ciertamente no hay consenso sobre la forma correcta de hacerlo.

He intentado y rechazado la subclase de bits de distutils. Me pareció frágil y difícil de trabajar en diferentes versiones de Python y diferentes sistemas.

Para nuestro código, después de probar los tipos de cosas que está considerando, me he decidido a realizar la detección y la configuración directamente en setup.py antes de la llamada principal al setup(). Esto es ciertamente un poco feo, pero significa que alguien que intenta compilar tus cosas tiene un lugar para descubrir, por ejemplo. por qué la ruta de inclusión es incorrecta. (Y ciertamente no necesitan ser expertos en distutils internals).

0

El comando config está diseñado para ser subclasificado y utilizado por proyectos con requisitos como el suyo.

Cuestiones relacionadas