如何正确设置python / c库?

时间:2011-01-06 20:43:10

标签: python c

我一直试图让python / c库像我的mingW编译器一样。蟒蛇在线捐赠; http://docs.python.org/c-api/intro.html#include-files只提到我需要导入python.h文件。我从安装目录中获取它(在Windows平台上需要),并通过编译脚本对其进行测试:     #include "Python.h"。这编译好了。接下来,我尝试了python / c API页面上显示的代码片段:

PyObject *t;
t = PyTuple_New(3);
PyTuple_SetItem(t, 0, PyInt_FromLong(1L));
PyTuple_SetItem(t, 1, PyInt_FromLong(2L));
PyTuple_SetItem(t, 2, PyString_FromString("three"));

由于某种原因,编译器会编译代码,如果我删除最后4行(这样只留下pyObject变量定义),但调用元组的实际构造函数返回错误。

我可能错过了一些完全明显的东西,因为我对C很新,但有人知道它是什么吗?

2 个答案:

答案 0 :(得分:2)

我做了一些狡猾的谷歌搜索,如果你在链接器阶段遇到错误(错误消息可能有十六进制字符串或对ld的引用),你可能需要确保发布的Python库Windows版本已经转换为GCC(MinGW)可以读取的格式;请参阅here以及其他网站。如果需要,还要确保GCC可以找到并使用库文件,使用-L/my/directory-lpython26(适当地替换您的路径和Python版本)。

如果错误处于编译阶段(如果消息中给出了行号),请确保您不需要将任何其他目录添加到包含搜索路径。 Python可能(我没有使用它的C API)包含Python.h中存储在其他目录中的其他头文件。如果是这种情况,请使用GCC的-I/my/directory/标志告诉它也在那里搜索。

确切(复制并粘贴)错误消息会有所帮助。


警告 :以下文字未回答此问题!

您是否将代码放入函数中?尝试将其放入main,如下所示:

int main(int argc, char *argv[]) {
    PyObject *t;
    t = PyTuple_New(3);
    PyTuple_SetItem(t, 0, PyInt_FromLong(1L));
    PyTuple_SetItem(t, 1, PyInt_FromLong(2L));
    PyTuple_SetItem(t, 2, PyString_FromString("three"));

    return 0;
}

此代码将在程序执行时运行。然后,您可以使用提供的任何其他方法来检查元组的内容。如果它不是作为可执行程序单独运行,那么将其粘贴在一个不同名称的方法中;我假设您有另一种方式来调用该函数。

PyObject *t;定义在函数外部作为全局变量定义有效,在函数内部有效,将其声明为局部变量。其他四行是函数调用,必须在另一个函数内。

上面的代码本身并不是程序制作的。您是否正在尝试为Python编写C扩展?如果是这样,请查看更完整的文档here

答案 1 :(得分:1)

自从我提出问题以来,我取得了一些进展,我认为如果其他人遇到类似的问题我会分享它。

这些是我得到的错误:

In function `main':
undefined reference to `_imp__PyTuple_New'
undefined reference to `_imp__PyInt_FromLong'
undefined reference to `_imp__PyTuple_SetItem'
undefined reference to `_imp__PyInt_FromLong'
undefined reference to `_imp__PyTuple_SetItem'
undefined reference to `_imp__PyString_FromString'
undefined reference to `_imp__PyTuple_SetItem'

我得到的错误是mingW编译器中缺少库的结果。因此,仅在源ode中包含头文件是不够的,还需要包含特殊文件(.lib,.o,.a,..)以进行编译。可以在mingW命令行上使用-l [path]标志,但我发现codeBlocks(http://www.codeblocks.org/)在这里使用起来最方便。创建项目并转到Project> Build options ..后,您可以在链接器设置选项卡下指定库文件的位置。完成后,构建项目,它将有希望工作。

我希望任何有类似问题的人都可以从中得到帮助:)