【问题标题】:Using multiples C codes in one extension module Python在一个扩展模块 Python 中使用多个 C 代码
【发布时间】:2017-05-31 21:23:44
【问题描述】:

我在 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)

我该如何修改它,以便code.c 函数可以在main.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代码就调用了modulemain C的函数(到目前为止一切顺利)。此时main.ccode.c调用一个函数,抛出如下错误:

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

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

【问题讨论】:

  • 您正在寻找文档。在 python.org 上搜索。
  • 您是直接调用这些函数还是code.c c-functions 中的函数也可以从Python 调用?在第一种情况下,您可以只链接到“code.c”(包括或类似于库),在后一种情况下,只需“导入”“code.c”python 模块。如果您正在寻找好的答案,您能否提供一些文件示例以及您希望如何调用它们?
  • @MSeifert 请参阅编辑。但简而言之,python 代码调用了main.c 中的函数。并且只有main.c 调用了code.c 中的函数。

标签: python c distutils python-c-extension


【解决方案1】:

评论太长了,我不确定它是否能解决问题。我认为这只是因为当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']
                  )
        ]

不确定源文件或依赖文件的顺序是否重要...

【讨论】:

  • 如果您从源列表中删除.h,它会完美运行。非常感谢我的朋友!!!!
  • @MFigueredo 不客气。只是一个问题-我不确定我是否正确理解了您的评论:sources=['main.c', 'code.c'](没有code.h)对您有用吗?
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多