2014-07-02 10 views
14

Ich versuche, einen Python-Multi-Datei-Code mit PyInstaller zu erstellen. Dafür habe ich den Code mit Cython kompiliert und verwende .so Dateien, die anstelle von .py Dateien generiert wurden.Cython-kompilierten Python-Code mit PyInstaller erstellen

die erste Datei Unter der Annahme main.py und die importierten sind file_a.py und file_b.py, ich file_a.so und file_b.so nach Cython Compilation bekommen.

Wenn ich main.py, file_a.so und file_b.so in einen Ordner und führen Sie es durch "python main.py", funktioniert es.

Aber wenn ich es mit PyInstaller erstelle und versuche, die ausführbare Datei erzeugt, wirft es Fehler für Importe in file_a und file_b getan.

Wie kann das behoben werden? Eine Lösung ist, alle Standardmodule in main.py zu importieren, und das funktioniert. Aber wenn ich meinen Code nicht ändern möchte, was kann dann die Lösung sein?

Antwort

12

Also habe ich das für Sie arbeiten lassen.

haben Sie einen Blick auf Bundling Cython extensions with Pyinstaller

Schnellstart:

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

Dieses eine statische binäre erzeugt:

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

und erzeugt die Ausgabe:

$ ./dist/hello 
Hello World! 
FooBar 

Im Grunde kam dies ein einfaches setup.py zu produzieren nach unten, die die Erweiterungen file_a.so und file_b.so baut und verwenden dann pyinstaller die Anwendung die Erweiterungen in ein einziges executebla zu bündeln.

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

die Erweiterungen Gebäude:

$ python setup.py develop 

die Anwendung bündeln:

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

Dieses perfekt funktioniert. Danke, dass du alles zusammengefügt hast! – rth

+0

Ja, überhaupt keine Sorgen! Es war * ziemlich * lustig! –

+0

Gibt es dafür ein Windows-Äquivalent? ./dist/build.sh wird nicht einmal mit cygwin erkannt – Tetora