2010-05-19 5 views

Respuesta

5

No se puede hacer un módulo de extensión vinculado estáticamente porque Python necesita cargarlo dinámicamente en el tiempo de ejecución y porque (como usted razonó) el módulo necesita vincular dinámicamente contra libpython.

Puede compilar su propia versión personalizada de Python con su extensión enlazada estáticamente en el intérprete. Eso suele ser más problemas de lo que vale.

¿Por qué quiere hacer una extensión enlazada estáticamente? Si tenemos más información sobre sus objetivos, podríamos ayudarlo a lograrlos de una manera diferente.

Bienvenido a StackOverflow. :-)

+0

Gracias Daniel, por la respuesta y la bienvenida :) Creo que estoy tratando de encontrar la mejor forma de distribuir una aplicación (que tiene extensiones C) a las principales plataformas sin requerir compilación en el momento de la instalación. – amoffat

+0

@Andrew: ¡Ah! ¿Por qué no lo dijiste? :) Usa el paquete de distribución (http://pypi.python.org/pypi/distribute) y crea huevos ('setup.py bdist_egg'). Para Windows, construya un instalador ('setup.py bdist_wininst'). Tenga cuidado con los problemas de incompatibilidad de Unicode (vea http://bugs.python.org/issue8654). –

+1

O, si su extensión envuelve algo que comúnmente ya se encuentra en estas plataformas, use ctypes en lugar de un módulo de extensión. – fraca7

3

Creo que estás mezclando cosas. No desea que la extensión esté enlazada estáticamente en el intérprete (lo cual es posible pero molesto ya que implica la reconstrucción de un intérprete personalizado), desea que su extensión no esté vinculada a pythonxx.dll, o que esté enlazada estáticamente a ella. Esto no es posible; su extensión y el intérprete de Python tendrían sus propias copias de las variables globales, por ejemplo, lo cual es Malo.

Hay otro enfoque, que es determinar qué versiones de Python están disponibles en tiempo de ejecución y usar dinámicamente la API de Python/C cargando la DLL de Python mediante LoadLibrary (Windows) o dlopen (Linux/etc), y luego decidir en tiempo de ejecución en las firmas de métodos dependiendo de la versión, etc. Muy engorroso. Para un ejemplo de este tipo de manipulación en Delphi, ver PythonForDelphi:

http://www.atug.com/andypatterns/pythonDelphiTalk.htm

No estoy al tanto de cualquier otro proyecto que haría eso.

+0

Gracias, veré el método de carga dinámica. – amoffat

Cuestiones relacionadas