Soy un novato de extensión. Lo que quiero hacer es crear una extensión que no requiera la instalación de otras bibliotecas. ¿Es esto imposible porque la extensión tiene que vincularse con una versión específica de libpython en tiempo de ejecución?¿Por qué las extensiones de python comparten bibliotecas? ¿Es posible crear una biblioteca estática?
¿Por qué las extensiones de python comparten bibliotecas? ¿Es posible crear una biblioteca estática?
Respuesta
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. :-)
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.
Gracias, veré el método de carga dinámica. – amoffat
- 1. ¿Qué contiene una biblioteca estática compilada por GCC?
- 2. Crear una biblioteca estática para iPhone
- 3. ¿Cómo crear una biblioteca estática de un proyecto de Xcode?
- 4. ¿Por qué las diversas extensiones JPEG?
- 5. ¿Por qué mi biblioteca estática es tan grande?
- 6. ¿Es posible utilizar las bibliotecas CommonJS todavía?
- 7. ¿Es posible crear un paquete Mono que incluya bibliotecas WPF?
- 8. ¿Es posible hacer extensiones a python/php/perl con Go?
- 9. ¿Por qué Libtool no quiere vincularse con una biblioteca estática?
- 10. ¿Por qué no __tribuye __ ((constructor)) trabajo en una biblioteca estática?
- 11. Biblioteca estática (.lib) al proyecto de Python
- 12. Crear una biblioteca estática y vincularla con premake
- 13. ¿Por qué no se encuentran los encabezados de biblioteca estática?
- 14. Biblioteca estática y Biblioteca dinámica: Confusión
- 15. Crear biblioteca estática en Xcode 4. ¿Qué ocurre con $ {BUILD_STYLE}?
- 16. ¿Cuáles son las mejores bibliotecas/utilidades/extensiones de javascript array?
- 17. CMake: ¿cómo crear una sola biblioteca compartida desde todas las bibliotecas estáticas de subproyectos?
- 18. Crear biblioteca estática en Xcode 4
- 19. ¿Es posible "ocultar" extensiones de idioma?
- 20. ¿Es posible incluir una biblioteca como lxml sin instalarla?
- 21. Vinculación con varias bibliotecas compartidas vinculadas todas contra una biblioteca estática común
- 22. ¿Cómo compilar Haskell a una biblioteca estática?
- 23. Pruebas de Boost.Test en una biblioteca estática
- 24. ¿Es posible usar una biblioteca C con Python AppEngine?
- 25. ¿Por qué es posible llamar a la función miembro no estática sin una instancia de objeto?
- 26. ¿Por qué la biblioteca de tiempo de ejecución es una opción de compilación en lugar de una opción de enlazador?
- 27. ¿Es posible crear objetos anónimos en Python?
- 28. ¿Es posible deshabilitar Excepciones y RTTI en las bibliotecas Boost?
- 29. cómo vincular una biblioteca estática para iOS
- 30. ¿Cuál es la biblioteca de facto para crear Python Daemons?
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
@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). –
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