使用Cython进行扩展,使用与源文件不同的名称

时间:2016-07-04 12:02:30

标签: python gcc cython

我知道如何使用cythonize -o mymodule.c mymodule.py或使用cython命令从Python生成C代码。生成的C文件必须使用gcc或任何其他C编译器编译为Python扩展,我也能够这样做。如果我想要它非常简单,我只需使用distutils / setuptoolspython setup.py build_ext

但我无法弄清楚如何使用 DIFFERENT 名称制作一个扩展文件(pyd / so),而不是源文件。我无法简单地重命名该文件,因为扩展程序中必须包含PyInit_modulename函数,而我无法将modulename.pyd更改为_modulename.pyd,这将需要PyInit__modulename并抛出此例:

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

基本上它应该是这样的:

mymodule.py -> _mymodule.pyd

这可以避免例如如果我有两个具有相同名称但结尾不同的文件(py / pyd / pyc / pyo / so / dll)导致混淆:

mydir/
  mymodule.py
  mymodule.pyd

代码:

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

我需要的是:

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

代码:

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

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

但是我怎么能这样编译呢?

提前谢谢!

只有一个想法:我想我需要在cython的C代码生成的某个地方开始。

1 个答案:

答案 0 :(得分:0)

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)