【问题标题】:Make extension using Cython, with a different name than the source file使用 Cython 进行扩展,名称与源文件不同
【发布时间】:2016-07-04 12:02:29
【问题描述】:

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

但我想不通的是如何制作一个与源文件名称不同的扩展文件(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 代码的某个地方开始。

【问题讨论】:

  • 似乎影响模块名称的唯一方法是更改​​ cython 文件的名称,即_modulename.pyx
  • @J.J.Hakala - 是的,经过几天的研究,我已经想到了。我为此制作了一个脚本,它会自动将临时目录中的文件保存为给定名称并编译文件

标签: python gcc cython


【解决方案1】:

在您的 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)

【讨论】:

  • 这不起作用,由于缺少 PyInit_original_name 函数,它会引发导入错误。这个我已经试过了,太简单了!
猜你喜欢
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
相关资源
最近更新 更多