对于Cython编译错误:动态模块未定义模块导出功能感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍动态模块加载,并为您提供关于c–.so模块在python中没有导入:动态模块没有定义init函
对于Cython编译错误:动态模块未定义模块导出功能感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍动态模块加载,并为您提供关于c – .so模块在python中没有导入:动态模块没有定义init函数、Cython编译的C扩展:ImportError:动态模块未定义init函数、cython编译错误怎么解决、ImportError:动态模块未定义初始化函数(initfizzbuzz)的有用信息。
本文目录一览:- Cython编译错误:动态模块未定义模块导出功能(动态模块加载)
- c – .so模块在python中没有导入:动态模块没有定义init函数
- Cython编译的C扩展:ImportError:动态模块未定义init函数
- cython编译错误怎么解决
- ImportError:动态模块未定义初始化函数(initfizzbuzz)
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函数
#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编译器,或使用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函数
我刚刚将我的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编译错误怎么解决”吧!
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)
我尝试编译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解释器”教程。它教您使fizzbuzz
C代码作为Python模块工作所需的一切知识。
关于Cython编译错误:动态模块未定义模块导出功能和动态模块加载的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c – .so模块在python中没有导入:动态模块没有定义init函数、Cython编译的C扩展:ImportError:动态模块未定义init函数、cython编译错误怎么解决、ImportError:动态模块未定义初始化函数(initfizzbuzz)的相关信息,请在本站寻找。
本文标签: