Comstackción de módulos externos requeridos con cython.

Estoy creando un ejecutable independiente usando Cython en Linux.

Tengo el siguiente código:

import psycopg2 as pg conn = pg.connect('dbname=**** user=**** password=****') cur = conn.cursor() cur.execute('SELECT version()') print(cur.fetchone()) 

El problema es que cuando la máquina no tiene instalado el paquete psycopg2 de Python, se produce la siguiente excepción:

 Traceback (most recent call last): File "test.py", line 2, in init test (test.c:872) import psycopg2 as pg ImportError: No module named 'psycopg2' 

Estoy construyendo usando la bandera de cython.

¿Cómo puedo hacer que Cython compile ese paquete en particular también?

Desde mi experiencia, no es tan sencillo crear un ejecutable independiente a partir de múltiples archivos de Python (el suyo o de dependencias como psycopg2). Yo diría que hay un par de enfoques que probaría:

El primero sería cython_freeze https://github.com/cython/cython/tree/master/Demos/freeze No lo uso por mi cuenta, por lo que no puedo decir mucho.

El segundo es usar pyinstaller para crear tal ejecutable. Toma como entrada los archivos .py o .pyc y los incrusta en un ejecutable, junto con el intérprete de Python y las dependencias necesarias, para que no tenga que instalar nada en la máquina de destino. Sin embargo, tenga en cuenta que su código se ejecutará como Python interpretado y se puede descomstackr e inspeccionar fácilmente.

Si realmente necesita comstackr (citonizar) su código, entonces primero puede cythonizar () y comstackr con setup () sus extensiones, luego ejecutar pyinstaller como se indica arriba (teniendo cuidado de que no encuentre los archivos .py o .pyc, solo las extensiones .pyd o .so) para generar el ejecutable independiente. En ambos casos, pyinstaller recostackrá todas sus dependencias y las integrará en el ejecutable (incluso si falla, puede decirle a pyinstaller que las incruste en hidden_imports).

Seguramente hay otros enfoques, como py2exe, pero cuando investigué y jugué con varias tecnologías hace algunos meses, pyinstaller fue la mejor opción para mí. Realizo el proceso en win, linux y mac sin muchos cambios.

EDIT: No me di cuenta de que el ejemplo es Python 3. Pyinstaller solo funciona para 2.x ahora.

–embed significa que el intérprete de Python está incrustado en su ejecutable. No significa independencia de Python. No hace lo que piensas. Suena más como si necesitas una herramienta como py2exe, py2app o pyfreeze.

Nuitka es la herramienta que necesitas.

Lo alimenta con su aplicación Python, hace muchas cosas inteligentes y escupe un ejecutable o un módulo de extensión.

En este momento, Nuitka es un buen reemplazo para el intérprete de Python y comstack todas las construcciones que ofrecen CPython 2.6, 2.7, 3.2, 3.3 y 3.4. Convierte Python en un progtwig C ++ que luego usa “libpython” para ejecutarse de la misma manera que CPython, de una manera muy compatible.

Ya es algo más rápido que CPython, pero en la actualidad no hace posibles todas las optimizaciones, pero un factor de 258% en pystone es un buen comienzo (el número es de la versión 0.3.11).