python 3 CAPI扩展导入

2024-09-28 05:20:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在macosx10.10.2上使用Python3。我对PythonC-API还不熟悉,所以我正在尝试“PythonCookbook”http://chimera.labs.oreilly.com/books/1230000000393/ch15.html中的一个简单的C-API扩展示例。我认为Python2号和Python3号之间有些区别。我跟踪了Python3的文档,但找不到为什么我的案子不起作用。在

直到用蒸馏工程(python3 setup.py buildpython3 setup.py build_ext --inplace)来构建,给我sample.so文件。 我编译了sample.c,同时得到了sample.o。在

但是,当我从python导入时,我收到一条如下所示的错误消息,我不明白发生了什么。下面显示了在ipython3中运行的错误消息。在

请帮助我解决这个问题的扩展模块。谢谢!在

In [1]: import sample
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-6-a769eab12f54> in <module>()
----> 1 import sample

ImportError: dlopen(/Users/suh/pyLNKS/python-api-example/sample/sample.so, 2): Symbol not found: _gcd
Referenced from: /Users/suh/pyLNKS/python-api-example/sample/sample.so
Expected in: flat namespace
in /Users/suh/pyLNKS/python-api-example/sample/sample.so

In [2]:

下面是文件pysample.csample.csample.h、和{}的代码。在

pysample.c

^{pr2}$

样品c

1 /* sample.c */
2 #include <math.h>
3 
4 /* compute the greatest common divisor */
5 int gcd(int x, int y){
6     int g = y;
7     while (x > 0){
8         g = x;
9         x = y % x;
10         y = g;
11     }
12     return g;
13 }

样品.h

1 /* sample.h */
2 #include <math.h>
3 
4 extern int gcd(int x, int y);

在设置.py在

1 # setup.py
2 from distutils.core import setup, Extension
3 
4 module1 = Extension('sample', sources = ['pysample.c'])
5 
6 setup(name='simple',
7         version = '1.0',
8         description = "this is a demo package",
9         ext_modules = [module1]
10         )
11 

Tags: sampleinpyimportapisoexamplesetup
2条回答

存在一个链接问题,源代码sample.c没有链接,因此gcd函数未定义。在

因此,代码设置.py需要更改为:

1 # setup.py
2 from distutils.core import setup, Extension
3 
4 module1 = Extension('sample', sources = ['pysample.c','source.c'])
5 
6 setup(name='simple',
7         version = '1.0',
8         description = "this is a demo package",
9         ext_modules = [module1]
10         )
11    

samplemodule结构中有一个打字错误。 模块名是“sample”,不是“samle”

相关问题 更多 >

    热门问题