在python中使用C扩展,而不将其作为模块安装

时间:2015-10-07 11:33:33

标签: python c python-2.7 python-c-api python-extensions

我正在为python编写C扩展。我只是暂时试验,我写了一个hello world扩展,看起来像这样:

#include <Python2.7/Python.h>

static PyObject* helloworld(PyObject* self)
{
    return Py_BuildValue("s", "Hello, Python extensions!!");
}

static char helloworld_docs[] = "helloworld( ): Any message you want to put here!!\n";

static PyMethodDef helloworld_funcs[] = {
    {"helloworld", (PyCFunction)helloworld, METH_NOARGS, helloworld_docs},
    {NULL,NULL,0,NULL}
};

void inithelloworld(void)
{
    Py_InitModule3("helloworld", helloworld_funcs,"Extension module example!");
}

从我编写的setup.py文件安装代码并从命令行安装后,代码完全正常

python setup.py install

我想要的是以下内容:

我想将C文件用作python扩展模块,而不安装它,我想在项目中使用它作为另一个python文件,而不是我需要在我的python模块获得之前安装的文件使用它的功能。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以直接编译扩展而无需安装(通常类似于python setup.py build)。然后,您必须确保解释器可以找到已编译的模块(例如,通过将其复制到导入它的脚本旁边,或设置PYTHONPATH)。

答案 1 :(得分:0)

您可以通过不扩展python来创建“自己的解释器”,而是将其嵌入到您的应用程序中。这样,您的对象将始终可供运行程序的用户使用。在某些情况下,这是非常常见的事情,例如,查看已包含所有bpybmeshbge模块的Blender项目。

缺点是,您的用户无法直接使用python命令,他们必须使用您的hello_world_python。 (当然,您也可以将扩展名作为模块提供。)这也意味着,您必须为要支持的所有平台编译和分发应用程序 - 如果您想将其作为二进制文件分发,让您的用户生活更轻松。

有关将python嵌入程序的更多信息,请阅读文档的主要部分:

Embedding Python in Another Application

  

个人建议: 尽可能使用Python 3.5,并停止支持旧的2.x版本。有关详细信息,请阅读以下文章:Should I use Python 2 or Python 3 for my development activity?