首页 > 解决方案 > 如何安装与 Python.h 关联的库

问题描述

我正在从 Python 调用 C。我的“hello world”程序引用了诸如 `PyUnicode_FromString' 之类的函数,我相信它们的原型在 Python.h 头文件中。我的系统有头文件,但似乎缺少相关的库。我不知道要安装什么。我已经完成了“apt-get install python3-dev”。要么我需要安装库,要么如果它已经存在,那么我需要在编译时指向它。这是我的代码:

#include <Python.h>
static PyObject* _hello_world(PyObject* self) {
    return PyUnicode_FromString("hello world");
}
static struct PyMethodDef methods[] ={
    {"hello_world", (PyCFunction)_hello_world, METH_NOARGS,},
    {NULL, NULL}
};

static struct  PyModuleDef module= {
    PyModuleDef_HEAD_INIT,
    "_hello",
    NULL,
    -1,
    methods
};

PyMODINIT_FUNC PyInit_hello(void) {
    return PyModule_Create(&module);
}

标签: pythonpython-3.x

解决方案


您要查找的库是libpython,它应该已经安装。在 Debian 和 Ubuntu 上,它在包中libpython3.8(或类似的,取决于版本)。

但是,如果您将 Python 嵌入到本机程序中,您应该只需要担心这一点。如果您通过用 C 编写模块来扩展 Python,我认为您根本不需要 libpython,并且无论如何distutils/setuptools如果您以通常的方式构建模块,则应该为您处理所有这些细节文档中描述


旁注:除非您有充分的理由,否则现在通常根本不建议使用 Python C/C++ API。如果您只是在玩耍并了解 CPython 的内部工作原理 - 太棒了!继续,玩得开心!

但是,如果您只想从 Python 程序中调用一些 C 代码,那么执行此操作的最佳方法通常是使用cffictypes调用它,或者在Cython中编写您的扩展模块。所有这些选项都更容易并且不太可能与 Python 的未来版本中断,并且前两个具有在 Python 的其他实现(即PyPy)上运行良好的额外好处。


推荐阅读