【问题标题】:Can't create PyObject from integer [closed]无法从整数创建 PyObject [关闭]
【发布时间】:2013-04-28 09:51:13
【问题描述】:

在用 C 语言编写 Python 扩展 时,我只是想测试一些东西,但意识到我无法从 C int 构建 PyObject*s。这里有一个演示问题的可编译代码 sn-p(如果不是在 Mac 上,您可能需要#include <Python.h>),

#include <Python/Python.h>
int main(){
    PyObject* obj = Py_BuildValue("i", 42);
    return 0;
}

但这会导致Segmentation fault: 11。根据 Xcode 的 LLDB,调用 PyInt_FromLong 时似乎有问题?

如果我尝试做同样的事情但使用double

PyObject* obj = Py_BuildValue("d", 42.0);

它工作得很好......我在网上找不到任何东西并且没有想法 - 感谢任何帮助。

【问题讨论】:

  • 我看不出代码有什么问题。您能否提出一个演示问题的最小完整示例并发布?
  • @NPE 代码只是设置 main 但我还是会发布它
  • 您是否正在尝试将 Python 嵌入到另一个应用程序中?为 Python 写一个扩展模块?仅使用 main sn-p,您就错过了整个 Python 运行时。

标签: python c extend python-c-api


【解决方案1】:

如果您尝试将 Python 嵌入到 C 程序中,您首先必须使用 Py_Initialize() 初始化 Python,完成后您应该调用 Py_Finalize()

试试这个...

#include <Python/Python.h>

int main()
{
    Py_Initialize();
    PyObject* obj = Py_BuildValue("i", 42);
    Py_Finalize();
    return 0;
}

...查看embedding docs 了解更多示例。

【讨论】:

  • 我不想在 C 代码中嵌入解释器。我只想用Py_BuildValue"d""s" 等做同样的事情。
  • @Jared: "integer" 失败而 "double" 工作的原因可能是因为整数使用了预建小整数的缓存,而缓存是从 Py_Initialize 构建的这样的缓存,所以它可以工作......偶然。
  • @Jared 如果您在不是扩展模块的 C 代码中调用 Py_BuildValue(),那么根据定义,您就是在 C 中嵌入 Python。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多