GVKun编程网logo

Cython编译错误:动态模块未定义模块导出功能(动态模块加载)

23

对于Cython编译错误:动态模块未定义模块导出功能感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍动态模块加载,并为您提供关于c–.so模块在python中没有导入:动态模块没有定义init函

对于Cython编译错误:动态模块未定义模块导出功能感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍动态模块加载,并为您提供关于c – .so模块在python中没有导入:动态模块没有定义init函数、Cython编译的C扩展:ImportError:动态模块未定义init函数、cython编译错误怎么解决、ImportError:动态模块未定义初始化函数(initfizzbuzz)的有用信息。

本文目录一览:

Cython编译错误:动态模块未定义模块导出功能(动态模块加载)

Cython编译错误:动态模块未定义模块导出功能(动态模块加载)

我正在Cython中构建一个程序包。我使用以下作为结构setup.py

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

extensions = [
    Extension("xxxxx",["xxxx/xxxxx.pyx"],include_dirs=[numpy.get_include(),"."]),Extension("nnls",["xxxxx/xxxxx.pyx"],]

setup(
    name='xxxxxx',version='0.0.0',description='''********''',url='xxxxxxx',author='xxxxx',author_email='xxxxx',packages=[
        'xxxxx',],install_requires=[
        'cython','numpy','scipy',ext_modules=cythonize(extensions),)

但是,在Python 3中安装时出现错误。它在Python 2中运行,但是在Python 3中未编译,但出现以下错误:

动态模块未定义模块导出功能

我怎么解决这个问题?是setup.py不编译的原因的结构吗?

c – .so模块在python中没有导入:动态模块没有定义init函数

c – .so模块在python中没有导入:动态模块没有定义init函数

我正在尝试为C函数编写一个 python包装器.在编写完所有代码并将其编译后,Python无法导入该模块.我按照 here给出的例子.我在修复一些拼写错误之后在这里重现它.有一个文件myModule.c:
#include <Python.h>

/*
 * Function to be called from Python
 */
static PyObject* py_myFunction(PyObject* self,PyObject* args)
{
    char *s = "Hello from C!";
    return Py_BuildValue("s",s);
}
/*
 * Bind Python function names to our C functions
 */
static PyMethodDef myModule_methods[] = {
    {"myFunction",py_myFunction,METH_VaraRGS},{NULL,NULL}
};

/*
 * Python calls this to let us initialize our module
 */
void initmyModule()
{
    (void) Py_InitModule("myModule",myModule_methods);
}

由于我在使用Macports python的Mac上,我将其编译为

$g++ -dynamiclib -I/Opt/local/Library/Frameworks/Python.framework/Headers -lpython2.6 -o myModule.dylib myModule.c
$mv myModule.dylib myModule.so

但是,当我尝试导入它时出现错误.

$ipython
In[1]: import myModule
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)

/Users/.../blahblah/.../<ipython console> in <module>()

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

为什么我不能导入它?

解决方法

由于您使用的是C编译器,因此函数名称将为 mangled(例如,我的g mangles void initmyModule()为_Z12initmyModulev).因此,python解释器将找不到模块的init函数.

您需要使用普通的C编译器,或使用extern “C”指令强制整个模块中的C链接:

#ifdef __cplusplus
extern "C" {
#endif 

#include <Python.h>

/*
 * Function to be called from Python
 */
static PyObject* py_myFunction(PyObject* self,s);
}

/*
 * Bind Python function names to our C functions
 */
static PyMethodDef myModule_methods[] = {
    {"myFunction",myModule_methods);
}

#ifdef __cplusplus
}  // extern "C"
#endif

Cython编译的C扩展:ImportError:动态模块未定义init函数

Cython编译的C扩展:ImportError:动态模块未定义init函数

我刚刚将我的C库的一部分编译为使用Cython的扩展,作为“概念证明”。我设法破解了代码(除了纠正const等问题之外),最终得到了扩展。

但是,当我尝试导入新创建的扩展名时,出现以下错误:

ImportError: dynamic module does not define init function

我在做什么错,我该如何解决?

我在Ubuntu 10.0.4上使用Cythn 0.11.2和Python 2.6.5

答案1

小编典典

我发现此问题的常见原因是,当使用distutils安装文件编译代码时,.pyx基本名称与扩展名不匹配,例如:

ext = Extension(name=''different'', sources=[''cython_ext.pyx'']) # Won''t work

为避免出现此问题,扩展名应完全相同,在这种情况下为cython_ext

cython编译错误怎么解决

cython编译错误怎么解决

这篇文章主要讲解了“cython编译错误怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“cython编译错误怎么解决”吧!

running build_ext
skipping ‘bBox.c’ Cython extension (up-to-date)
skipping ‘nms.c’ Cython extension (up-to-date)
building ‘cython_bBox’ extension
{‘gcc’: [’-Wno-cpp’, ‘-Wno-unused-function’]}
gcc -pthread -B /home/gsadhasivam/anaconda3/envs/r3det/compiler_compat -Wl,–sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/gsadhasivam/anaconda3/envs/r3det/lib/python3.7/site-packages/numpy/core/include -I/home/gsadhasivam/anaconda3/envs/r3det/include/python3.7m -c bBox.c -o build/temp.linux-x86_64-3.7/bBox.o -Wno-cpp -Wno-unused-function
bBox.c: In function ‘__Pyx__ExceptionSave’:
bBox.c:9439:19: error: ‘PyThreadState’ has no member named ‘exc_type’
*type = tstate->exc_type;
^
bBox.c:9440:20: error: ‘PyThreadState’ has no member named ‘exc_value’
*value = tstate->exc_value;
^
bBox.c:9441:17: error: ‘PyThreadState’ has no member named ‘exc_traceback’
*tb = tstate->exc_traceback;
^
bBox.c: In function ‘__Pyx__ExceptionReset’:
bBox.c:9448:22: error: ‘PyThreadState’ has no member named ‘exc_type’
tmp_type = tstate->exc_type;
^
bBox.c:9449:23: error: ‘PyThreadState’ has no member named ‘exc_value’
tmp_value = tstate->exc_value;
^
bBox.c:9450:20: error: ‘PyThreadState’ has no member named ‘exc_traceback’
tmp_tb = tstate->exc_traceback;
^
bBox.c:9451:11: error: ‘PyThreadState’ has no member named ‘exc_type’
tstate->exc_type = type;
^
bBox.c:9452:11: error: ‘PyThreadState’ has no member named ‘exc_value’
tstate->exc_value = value;
^
bBox.c:9453:11: error: ‘PyThreadState’ has no member named ‘exc_traceback’
tstate->exc_traceback = tb;
^
bBox.c: In function ‘__Pyx__GetException’:
bBox.c:9508:22: error: ‘PyThreadState’ has no member named ‘exc_type’
tmp_type = tstate->exc_type;
^
bBox.c:9509:23: error: ‘PyThreadState’ has no member named ‘exc_value’
tmp_value = tstate->exc_value;
^
bBox.c:9510:20: error: ‘PyThreadState’ has no member named ‘exc_traceback’
tmp_tb = tstate->exc_traceback;
^
bBox.c:9511:11: error: ‘PyThreadState’ has no member named ‘exc_type’
tstate->exc_type = local_type;
^
bBox.c:9512:11: error: ‘PyThreadState’ has no member named ‘exc_value’
tstate->exc_value = local_value;
^
bBox.c:9513:11: error: ‘PyThreadState’ has no member named ‘exc_traceback’
tstate->exc_traceback = local_tb;
^
error: command ‘gcc’ Failed with exit status 1

首先,发现python是3.7,所以需要将python版本换为3.5即可。

感谢各位的阅读,以上就是“cython编译错误怎么解决”的内容了,经过本文的学习后,相信大家对cython编译错误怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是小编,小编将为大家推送更多相关知识点的文章,欢迎关注!

ImportError:动态模块未定义初始化函数(initfizzbuzz)

ImportError:动态模块未定义初始化函数(initfizzbuzz)

我尝试编译fizzbuzz.c,以便通过python导入它。对于建筑fizzbuzz.c,我用过python setup.py build_ext-i

构建它之后,我尝试导入,fizzbuzz.c但是发生以下错误。我怎么解决这个问题 ?

错误

>>> import fizzbuzzTraceback (most recent call last):  File "<stdin>", line 1, in <module>ImportError: dynamic module does not define init function (initfizzbuzz)

fizzbuzz.c

#include <stdio.h>void fizzbuzz(int n){    for (int i=1; i <= n; i++){        if (i % 3 == 0 && i % 5 ==0){            printf("fizzbuzz %d \n", i);        }        else if (i % 3 == 0){            printf("fizz %d \n", i);        }        else if(i % 5 == 0){            printf("buzz %d \n", i);        }    }}

setup.py

from distutils.core import setup, Extensionmodule = Extension(''fizzbuzz'', [''fizzbuzz.c''])setup(      name=''fizzbuzz'',      version=''1.0'',      ext_modules=[module],)

答案1

小编典典

Python不支持,也不支持将任意C文件作为模块。您必须遵循某些约定才能让Python知道您的模块支持哪些功能。

为此,Python将寻找一个init<name>函数,<name>模块名称在哪里。Python正在寻找initfizzbuzz但未能找到它,因此加载模块失败。

除了初始化程序外,您还需要提供一个结构,详细说明可用的函数,并且您的函数将需要将Python类型作为参数进行处理。Python为您提供了必要的实用程序功能,并对其进行了定义以使其变得足够容易。

我强烈建议您遵循“扩展和嵌入Python解释器”教程。它教您使fizzbuzzC代码作为Python模块工作所需的一切知识。

关于Cython编译错误:动态模块未定义模块导出功能动态模块加载的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c – .so模块在python中没有导入:动态模块没有定义init函数、Cython编译的C扩展:ImportError:动态模块未定义init函数、cython编译错误怎么解决、ImportError:动态模块未定义初始化函数(initfizzbuzz)的相关信息,请在本站寻找。

本文标签: