2015-01-08 9 views
6

Ich versuche, von der Verwendung von Pycimport zum Aufbau über Distutils zu konvertieren, und ich bin durch die seltsamen Entscheidungen ratlos, die es auf macht Wohin mit den .so-Dateien. Also habe ich beschlossen, das Tutorial aus dem Cython-Dokument zu erstellen, nur um zu finden, dass es eine Nachricht ausgibt, die sein Gebäude sagt, aber nicht tut. Ich bin in einem virtualenv, und Cython, Python2.7, usw. sind alle darin installiert.Cython Build über setup.py macht falsche Sache (setzen alle .so Dateien in extra src dir)

Zuerst werden die Grundlagen:

$ cython --version 
Cython version 0.21.2 
$ cat setup.py 
from distutils.core import setup 
from Cython.Build import cythonize 
print "hello build" 
setup(
    ext_modules = cythonize("helloworld.pyx") 
) 
$ cat helloworld.pyx 
print "hello world" 

Nun, wenn ich es bauen sieht alles ok mit Ausnahme der zusätzlichen src/src Sachen in der Ausgabe:

$ python setup.py build_ext --inplace 
hello build 
Compiling helloworld.pyx because it changed. 
Cythonizing helloworld.pyx 
running build_ext 
building 'src.helloworld' extension 
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c helloworld.c -o build/temp.linux-x86_64-2.7/helloworld.o 
creating /home/henry/Projects/eyeserver/dserver/src/src 
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/helloworld.o -o /home/henry/Projects/eyeserver/dserver/src/src/helloworld.so 

Und wenn ich laufe es, es von natürlich scheitert:

$ echo "import helloworld" | python 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ImportError: No module named helloworld 

Bis ich bewegen die .so aus seiner zusätzlichen src Verzeichnis file:

$ mv src/helloworld.so . 
$ echo "import helloworld" | python 
Hello world 

Was mache ich falsch? Natürlich könnte ich den Build-Prozess veranlassen, alle .so-Dateien zu verschieben, aber das scheint wirklich hacky zu sein.

+2

Ich kann nicht mit 'Python-2.7.6' und' Cython-0.21.2' auf einem OSX-Rechner reproduzieren. – cel

+0

Warum befindet sich Ihre .so-Datei in einem 'src'-Verzeichnis? Woher kam dieses Verzeichnis? Sie erwähnen das nie in Ihrem Setup. – fnl

+0

BTW, auch wenn ich 'helloworld.pyx' in ein" src "-Verzeichnis innerhalb des Projekts verschiebe und die cythonize-Zeile in' setup.py' entsprechend mit 'src/helloword.pyx' ändere, wird immer noch die .so-Datei eingefügt im Basisverzeichnis des Projekts. Ich denke, es muss etwas mehr zu Ihrer Projekteinrichtung gehören. – fnl

Antwort

5

Immer wenn ich Cython verwende, verwende ich den Extension Befehl.

würde ich die setup.py-Datei schreiben, wie folgt:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Build import cythonize 

extensions = [ 
    Extension("helloworld", ["helloworld.pyx"]) 
] 

setup(
    ext_modules = cythonize(extensions) 
) 

Hoffentlich wird dies legte die .so-Datei im aktuellen Verzeichnis dann.

+0

Erweiterungen scheint nicht definiert zu sein, wenn ich Ihre Setup-Datei wie angegeben ausführen - was mache ich falsch. Das Importieren von distutils.core.Extensions funktioniert auch nicht ... –

+1

Sie müssen 'from distutils.extension import Extension', nicht vom Kern ausführen. Hier ist ein gutes [setup.py-Beispiel] (https://github.com/syllog1sm/redshift/blob/master/setup.py) für ein Cython-Projekt. – fnl

+1

Es gibt einen Tippfehler im Aufruf von 'Extension' (extra" s "). Versucht, den Beitrag zu bearbeiten, aber ich muss mindestens 6 Zeichen bearbeiten: S. – rocarvaj

Verwandte Themen