python - 在一个扩展模块 Python 中使用多个 C 代码

标签 python c distutils python-c-extension

我在 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 函数?

这里是情况的概要:

主.c

#include <Python.h>
#include "code.h"

//....

void send(char* name)
{
   //DO SOMETHING
   function_from_code(name)
}

代码.c

.....

#include "code.h"

void function_from_code(char* name)
{
   //DO SOMETHING
}  

然后是 Python 代码:

import main

...

main.send("My Name")

因此,python 代码以这种方式调用了 module main C 的函数(到目前为止一切正常)。此时 main.ccode.c 调用一个函数,它抛出以下错误:

ImportError: /usr/local/lib/python2.7/dist-packages/main.so: undefined symbol: function_from_code

显然,使用 #include 是不够的。

最佳答案

评论太长了,我不确定它是否能解决问题。我认为这只是因为它不编译 code.ccode.h 当它们没有被明确列为源代码时(参见 "Extension names and packages" )。

我个人会使用 depends Extension 的参数:

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 - 在一个扩展模块 Python 中使用多个 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44294895/

相关文章:

通过scanf在C中输入char

c++ - C++ 中 char* 中的子字符串,strtok 到行尾

python - 如何在通过 python 扩展访问的 C++ 库中捕获 AddressSanitizer 引发的错误

python - 即使在 Linux 上也强制 `sdist` 创建 .zip 存档

python - 设置、测试和安装 Python 库的依赖项(要求)

python - (~) 为什么我的位没有翻转?

python - 如何使用 openpyxl 正确格式化日期?

python - 按值获取枚举名称

c - 使用 max_align_t 存储一大块字节

python - 如何创建混淆的本地密码