在一个扩展模块中使用多个 C 代码 Python
Using multiples C codes in one extension module Python
我在 Python 项目中使用了 C 代码,就像在 this 教程中一样。
我构建了一个扩展,以便可以通过 Python 调用 main.c
代码中的 A
函数。但是,函数 A
会调用名为 code.c
的文件中存在的其他各种函数,我在使用这些函数时遇到了问题。
如果所有的功能都放在main.c
里没有问题,但是由于组织原因我想把这个项目模块化!
构建模块的setup.py
如下。
ext = [
Extension(
'main',
sources = ['main.c'] ,
extra_compile_args=['-lpq'] ,
extra_link_args = ['-L/usr/local/pgsql/lib','-lpq'],
language=['c']
)
]
setup(name='project', version='1.0', ext_modules = ext)
我如何修改它,以便可以在 main.c
中毫无问题地使用 code.c
函数?
概况如下:
main.c
#include <Python.h>
#include "code.h"
//....
void send(char* name)
{
//DO SOMETHING
function_from_code(name)
}
code.c
.....
#include "code.h"
void function_from_code(char* name)
{
//DO SOMETHING
}
然后是 Python 代码:
import main
...
main.send("My Name")
这样,python 代码调用了 module
主 C 的函数(到目前为止一切顺利)。目前 main.c
从 code.c
调用一个函数,它抛出以下错误:
ImportError: /usr/local/lib/python2.7/dist-packages/main.so: undefined symbol: function_from_code
显然,使用 #include
是不够的。
评论太长了,我不确定它是否能解决问题。我认为这只是因为当 code.c
和 code.h
未明确列为源代码时它不会编译它们(参见 "Extension names and packages")。
就我个人而言,我会为 Extension
使用 depends
参数:
from glob import glob
ext = [Extension('main',
sources=['main.c'] ,
depends=glob('*.c') + glob('*.h'),
extra_compile_args=['-lpq'] ,
extra_link_args=['-L/usr/local/pgsql/lib','-lpq'],
language=['c']
)
]
或列出source
中的所有文件:
ext = [Extension('main',
sources=['main.c', 'code.h', 'code.c'] ,
extra_compile_args=['-lpq'] ,
extra_link_args=['-L/usr/local/pgsql/lib','-lpq'],
language=['c']
)
]
不确定源文件或依赖文件的顺序是否重要...
我在 Python 项目中使用了 C 代码,就像在 this 教程中一样。
我构建了一个扩展,以便可以通过 Python 调用 main.c
代码中的 A
函数。但是,函数 A
会调用名为 code.c
的文件中存在的其他各种函数,我在使用这些函数时遇到了问题。
如果所有的功能都放在main.c
里没有问题,但是由于组织原因我想把这个项目模块化!
构建模块的setup.py
如下。
ext = [
Extension(
'main',
sources = ['main.c'] ,
extra_compile_args=['-lpq'] ,
extra_link_args = ['-L/usr/local/pgsql/lib','-lpq'],
language=['c']
)
]
setup(name='project', version='1.0', ext_modules = ext)
我如何修改它,以便可以在 main.c
中毫无问题地使用 code.c
函数?
概况如下:
main.c
#include <Python.h>
#include "code.h"
//....
void send(char* name)
{
//DO SOMETHING
function_from_code(name)
}
code.c
.....
#include "code.h"
void function_from_code(char* name)
{
//DO SOMETHING
}
然后是 Python 代码:
import main
...
main.send("My Name")
这样,python 代码调用了 module
主 C 的函数(到目前为止一切顺利)。目前 main.c
从 code.c
调用一个函数,它抛出以下错误:
ImportError: /usr/local/lib/python2.7/dist-packages/main.so: undefined symbol: function_from_code
显然,使用 #include
是不够的。
评论太长了,我不确定它是否能解决问题。我认为这只是因为当 code.c
和 code.h
未明确列为源代码时它不会编译它们(参见 "Extension names and packages")。
就我个人而言,我会为 Extension
使用 depends
参数:
from glob import glob
ext = [Extension('main',
sources=['main.c'] ,
depends=glob('*.c') + glob('*.h'),
extra_compile_args=['-lpq'] ,
extra_link_args=['-L/usr/local/pgsql/lib','-lpq'],
language=['c']
)
]
或列出source
中的所有文件:
ext = [Extension('main',
sources=['main.c', 'code.h', 'code.c'] ,
extra_compile_args=['-lpq'] ,
extra_link_args=['-L/usr/local/pgsql/lib','-lpq'],
language=['c']
)
]
不确定源文件或依赖文件的顺序是否重要...