2015-12-17 20 views
12

Es scheint, dass das Setup von distutils.core mit cmdclass, das auf build_ext festgelegt ist, standardmäßig eine cpp- oder c-Datei im aktuellen Arbeitsverzeichnis kompiliert. Gibt es eine Möglichkeit zu bestimmen, wo der generierte c-Code geschrieben wird? Andernfalls wird ein Repository mit generiertem Code übersät sein.Angeben der Cython-Ausgabedatei

Zum Beispiel diese Datei setup.py eine Datei example.c zum aktuellen Arbeitsverzeichnis schreiben wird:

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

setup(
     ext_modules = cythonize("example.pyx")) 

Antwort

7

Sie passieren können die Option build_dir="directory name" zu Cythonize

# rest of file as before 
setup(
     ext_modules = cythonize("example.pyx", 
           build_dir="build")) 

Der obige Code wird Legen Sie die generierten c-Dateien in das Verzeichnis "build" (was sinnvoll ist, da distutils standardmäßig temporäre Objektdateien ablegt und so weiter, wenn sie erstellt werden).


Meine ursprüngliche Antwort hatte working, nicht build_dir. Danke an @ArthurTacca für den Hinweis, dass das nicht mehr richtig zu sein scheint.

+1

Die richtige Wahl zu sein scheint "build_dir" funktioniert nicht. Vielleicht hat es sich in einer neueren Version von Cython geändert. Um Konflikte mit anderen Build-Dateien zu vermeiden, ist es wahrscheinlich am besten, nicht nur "build" zu verwenden. Ein Unterverzeichnis wie "build/cython" wäre besser. –

+0

Auf den ersten Blick siehst du richtig aus - danke. Wenn ich den Code auf github anschaue, kann ich nicht sehen, wo er sich seit 2015 verändert hat. Wer weiß, wo ich ihn herbekommen habe (aber ich stelle mir vor, dass er zu der Zeit funktioniert hat ...). Ich werde es aktualisieren, sobald ich bestätigt habe, dass es funktioniert. – DavidW

3

Nach dem Initialisieren einer Extension können die Parameter so eingestellt werden, dass c im temporären Verzeichnis erstellt wird.

module = Extension("temp", "temp.pyx") 
module.cython_c_in_temp = True 
+0

Ich denke, das ist eine etwas bessere Lösung als meine Antwort. – DavidW

1

Ihre setup.py ist in Ordnung.

Um es an einem anderen Ort, rufen Sie Python in der folgenden Art und Weise zu bauen:

python setup.py build_ext --build-lib <build directory> 

Ich verwende die folgenden machen Regeln, dies zu automatisieren:

python_lib_dir=src/lib 

cython_output = $(patsubst $(python_lib_dir)/%.pyx,$(python_lib_dir)/%.so, $(shell find $(python_lib_dir) -name '*.pyx')) 

$(cython_output):%.so:%.pyx  
    python setup.py build_ext --build-lib $(python_lib_dir) 
Verwandte Themen