2014-07-02 13 views
14

Sto cercando di creare un codice multi-file Python con PyInstaller. Per questo ho compilato il codice con Cython e sto usando i file .so generati al posto dei file .py.Creazione codice Python compilato da Cython con PyInstaller

Supponendo che il primo file è main.py e quelli importati sono file_a.py e file_b.py, ottengo file_a.so e file_b.so dopo la compilazione Cython.

Quando inserisco main.py, file_a.so e file_b.so in una cartella ed eseguirlo da "python main.py", funziona.

Ma quando lo compilo con PyInstaller e provo a eseguire l'eseguibile generato, esso genera errori per le importazioni eseguite in file_a e file_b.

Come può essere risolto? Una soluzione è quella di importare tutti i moduli standard in main.py e questo funziona. Ma se non desidero cambiare il mio codice, quale può essere la soluzione?

risposta

12

Quindi ho ottenuto questo lavoro per voi.

Si prega di dare un'occhiata a Bundling Cython extensions with Pyinstaller

Avvio rapido:

git clone https://github.com/prologic/pyinstaller-cython-bundling.git 
cd pyinstaller-cython-bundling 
./dist/build.sh 

Questo produce un binario statico:

$ du -h dist/hello 
4.2M dist/hello 
$ ldd dist/hello 
    not a dynamic executable 

e produce l'output:

$ ./dist/hello 
Hello World! 
FooBar 

Fondamentalmente questo discese per produrre una semplice setup.py che costruisce le estensioni file_a.so e file_b.so e quindi utilizza pyinstaller per impacchettare l'applicazione delle estensioni in un singolo executebla.

Esempio 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") 
) 

Costruire le estensioni:

$ python setup.py develop 

Raggruppare l'applicazione:

$ pyinstaller -r file_a.so,dll,file_a.so -r file_b.so,dll,file_b.so -F ./bin/hello 
+1

Questo funziona perfettamente. Grazie per aver messo tutto insieme! – rth

+0

Sì, non preoccuparti affatto! Era * abbastanza * divertente! –

+0

Esiste un equivalente di Windows per questo? ./dist/build.sh non sono riconosciuti nemmeno con cygwin – Tetora