2016-07-04 4 views
1

Ich weiß, wie man C-Code von Python mit cythonize -o mymodule.c mymodule.py oder mit dem cython Befehl machen. Die resultierende C-Datei muss mit gcc oder einem anderen C-Compiler in eine Python-Erweiterung kompiliert werden, und das kann ich auch. Wenn ich es wirklich einfach will, verwende ich einfach distutils/setuptools und python setup.py build_ext.Machen Sie Erweiterung mit Cython, mit einem anderen Namen als die Quelldatei

Aber was ich nicht herausfinden kann ist, wie man eine Erweiterungsdatei (pyd/so) mit einem VERSCHIEDENEN Namen als die Quelldatei erstellt. Ich kann einfach nicht die Datei umbenennen aufgrund der Tatsache, dass es eine Funktion PyInit_modulename in der Verlängerung zu sein hat, und ich kann nicht modulename.pyd zu _modulename.pyd ändern, dass PyInit__modulename erfordern würde und werfen diese Ausnahme:

ImportError: dynamic module does not define init function (PyInit__modulename) 

Grundsätzlich sollte es so sein:

mymodule.py -> _mymodule.pyd 

Dies vermeidet z wenn die Import Verwirrung Ich habe zwei Dateien mit dem gleichen Namen, aber ein anderes Ende (py/pyd/pyc/Pyo/so/dll):

mydir/ 
    mymodule.py 
    mymodule.pyd 

Code:

from mymodule import func 
func() 
# Is this now from the extension or from the python code? 
# And how to access tho other one? 

Was ich brauche, ist :

mydir/ 
    mymodule.py 
    _mymodule.pyd <- Note the underscore! 

Code:

import mymodule as script 
script.func() 
# Run the code from the python file 

import _mymodule as extension 
extension.func() 
# Run code from the extension 

Aber wie kann ich so kompilieren?

Vielen Dank im Voraus!


Nur ein dachten, ich hätte: Ich glaube, ich brauche irgendwo an der C-Code-Generation mit cython zu starten.

+0

Es scheint, dass der einzige Weg, den Modulnamen, indem Sie den Namen der Datei cython beeinträchtigen das heißt '_modulename.pyx'. –

+0

@ J.J.Hakala - Ja, das dachte ich schon nach ein paar Tagen Forschung. Ich habe dafür ein Skript erstellt, welches automatisch die Datei im temporären Verzeichnis unter einem bestimmten Namen speichert und die Datei kompiliert. – linusg

Antwort

0

Versuchen Sie dies in Ihrem setup.py

try: 
    from setuptools import setup 
    from setuptools import Extension 
except ImportError: 
    from distutils.core import setup 
    from distutils.extension import Extension 

from Cython.Distutils import build_ext 
import numpy as np # if it requires numpy 

ext_modules = [Extension("desired_name",["original_name.pyx"])] 

setup(
    name= 'Generic model class', 
    cmdclass = {'build_ext': build_ext}, 
    include_dirs = [np.get_include()], # only if it requires numpy 
    ext_modules = ext_modules) 
+0

Das funktioniert nicht, es löst einen Importfehler aufgrund der fehlenden PyInit_original_name Funktion aus. Ich habe das schon mal probiert, es wäre zu einfach! – linusg