Construyendo código de Python compilado por Cython con PyInstaller
(1)
Estoy tratando de construir un código de varios archivos de Python con PyInstaller
. Para eso he compilado el código con Cython
, y estoy usando archivos .so
generados en lugar de archivos .py
.
Suponiendo que el primer archivo es main.py
y los importados son file_a.py
y file_b.py
, obtengo file_a.so
y file_b.so
después de la compilación de Cython.
Cuando coloco main.py
, file_a.so
y file_b.so
en una carpeta y lo ejecuto con "python main.py"
, funciona.
Pero cuando lo construyo con PyInstaller
e intento ejecutar el ejecutable generado, genera errores para las importaciones realizadas en file_a
y file_b
.
¿Cómo se puede arreglar esto? Una solución es importar todos los módulos estándar en main.py
y esto funciona. Pero si no deseo cambiar mi código, ¿cuál puede ser la solución?
Así que tengo esto para trabajar para ti.
Por favor, eche un vistazo a las extensiones de Cyling de paquete con Pyinstaller
Inicio rápido:
git clone https://github.com/prologic/pyinstaller-cython-bundling.git
cd pyinstaller-cython-bundling
./dist/build.sh
Esto produce un binario estático:
$ du -h dist/hello
4.2M dist/hello
$ ldd dist/hello
not a dynamic executable
Y produce la salida:
$ ./dist/hello
Hello World!
FooBar
Básicamente, esto se setup.py
a la producción de un simple setup.py
que construye las extensiones file_a.so
y file_b.so
y luego usa pyinstaller para agrupar las aplicaciones en una sola ejecución.
Ejemplo setup.py
:
from glob import glob
from setuptools import setup
from Cython.Build import cythonize
setup(
name="test",
scripts=glob("bin/*"),
ext_modules=cythonize("lib/*.pyx")
)
Construyendo las extensiones:
$ python setup.py develop
Agrupar la aplicación:
$ pyinstaller -r file_a.so,dll,file_a.so -r file_b.so,dll,file_b.so -F ./bin/hello