`

python c++ extension

阅读更多
在调试PIL的扩展Agg中对python的c扩展感到了好奇,所幸研究了一下python的c扩展。
并自己根据例子写了一下效果还不错,以下代码供大家学习:)
我本人对c不大了解,欢迎大家,分析install 流程 :)

执行结果:


编写代码spam.cxx

/*
How to use :
	import spam
	status = spam.system("ls -l")
dome is C++ Extension
*/

#define VERSION "1.2a3"

#if defined(_MSC_VER)
#define WINDOWS_LEAN_AND_MEAN
#include <windows.h>
#endif

#include "Python.h"

#if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x01060000
#if PY_VERSION_HEX  < 0x02020000 || defined(Py_USING_UNICODE)
/* defining this enables unicode support (default under 1.6a1 and later) */
#define HAVE_UNICODE
#endif
#endif

/* 
   Function Define and AttributesDefine 
*/
static PyObject *CmdError;
static PyObject *
cmd(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

	/*
	int PyArg_ParseTuple(PyObject *args, const char *format, ...) 
	return true or false | exception
	*/
    if (!PyArg_ParseTuple(args, "s", &command))
	{
		PyErr_SetString(CmdError, "System command failed");
		return NULL;
	}
	else{
		printf("run command is:");
 		puts(command); //or use PyObject_Print for debug
	}
    sts = system(command);
	//PyObject* Py_BuildValue(const char *format, ...)
    return Py_BuildValue("i", sts);
}



static PyMethodDef CmdMethods[] = {
    {"cmd", (PyCFunction) cmd, METH_VARARGS},
    {NULL, NULL}
};


/* 
   Initial Modules
*/

PyMODINIT_FUNC
initspam(void)
{
    PyObject *m;
    m = Py_InitModule("spam", CmdMethods);
    if (m == NULL)
        return;
	/*
	PyObject* PyErr_NewException(char *name, PyObject *base, PyObject *dict)
	*/
    CmdError = PyErr_NewException("system.error", NULL, NULL);
    Py_INCREF(CmdError);
    PyModule_AddObject(m, "error", CmdError);
};

extern "C"
DL_EXPORT(void)
initaggdraw(void)
{
    /* Initialize the Python interpreter.  Required. */
    Py_Initialize();

    /* Add a static module */
    initspam();

	PyObject* g = PyDict_New();
	PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins());
    PyRun_String("print 'welcome!'\n", Py_file_input, g, NULL);
}


setup.py
from distutils.core import setup, Extension

moduleSpam = Extension('spam',sources = ['spammodule.cxx'])

setup(name = 'Spam system',
       version = '1.0',
       description = 'This is a demo package for run system command',
       ext_modules = [moduleSpam])



跟踪了一下安装过程,发现setup 查找Setup.local文件:
/*
 在 Setup.local 文件中我们可以指定输出
*/
spam spammodule.so



:execve("/usr/bin/python", ["python", "setup.py", "install"], [/* 57 vars */]) = 0
104:stat("/usr/bin/Modules/Setup", 0x7fff47082070) = -1 ENOENT (No such file or directory)
419:stat("/usr/local/lib64/python2.6/site-packages/setuptools-0.6c11-py2.6.egg", {st_mode=S_IFREG|0644, st_size=333581, ...}) = 0
446:open("/usr/local/lib64/python2.6/site-packages/setuptools.pth", O_RDONLY) = 5
450:read(5, "./setuptools-0.6c11-py2.6.egg\n", 8192) = 30
469:stat("/usr/local/lib64/python2.6/site-packages/setuptools-0.6c11-py2.6.egg", {st_mode=S_IFREG|0644, st_size=333581, ...}) = 0
470:open("/usr/local/lib64/python2.6/site-packages/setuptools-0.6c11-py2.6.egg", O_RDONLY) = 4
2738:lstat("/home/bmc/test/ct/Modules/setup.py", {st_mode=S_IFREG|0644, st_size=262, ...}) = 0
2739:stat("setup.py", {st_mode=S_IFREG|0644, st_size=262, ...}) = 0
2740:open("setup.py", O_RDONLY)              = 3
2745:read(3, "from distutils.core import setup"..., 240) = 240
2749:stat("setup.py", {st_mode=S_IFREG|0644, st_size=262, ...}) = 0
2750:open("setup.py", O_RDONLY)              = 3
2756:read(3, "from distutils.core import setup"..., 4096) = 262
2853:read(4, "\0\0\0error in %s setup command: %s"..., 4096) = 3617
3915:stat("setup.cfg", 0x7fff47083e70)       = -1 ENOENT (No such file or directory)
3999:stat("/usr/bin/Modules/Setup.dist", 0x7fff4707c980) = -1 ENOENT (No such file or directory)
4000:stat("/usr/bin/Modules/Setup.local", 0x7fff4707c980) = -1 ENOENT (No such file or directory)
分享到:
评论
2 楼 mirguest 2011-03-04  
的确,目前我写些简单的代码,用boost很方便。
我最近在学的Gaudi.Python,好像也很牛。
大致是用c++写好算法,然后可以用python来调用。
大家感兴趣可以看看:https://lhcb-comp.web.cern.ch/lhcb-comp/
1 楼 mathgl 2011-02-27  
a handy solution is to use swig or boost.python(for c++ extension only) to wrap your 3rd libs...

相关推荐

    从C++导出类到Python

    本教程将聚焦于如何从C++中导出类到Python,这样你就可以在Python环境中利用C++的强大性能和效率。这通常通过Python的C API或者第三方库如SWIG(Simplified Wrapper and Interface Generator)来实现。 **C++导出类...

    python扩展c++示例

    2. **编写 C++ 代码**:创建一个 `.cpp` 文件,例如 `extension.cpp`,在这里定义你要导出到 Python 的函数。这个函数需要使用 C 风格的接口,因为 Python C API 是基于 C 的。 ```cpp #include &lt;Python.h&gt; // ...

    C++扩展Python源码

    本文将深入探讨如何使用C++扩展Python源码,以标题中提到的"AddTwoValue_Python_Extension"为例,我们将讨论C++扩展的基本原理、步骤以及其在Python 3.1环境中的应用。 首先,理解Python的C API是关键。Python提供...

    Python调用C++封装

    `Extension_Class.cpp`可能是这样的一个C++源文件,包含Python C API调用。 2. SWIG SWIG是一个自动化的接口生成器,它可以将C++接口转换为多种高级语言,包括Python。首先,你需要创建一个SWIG接口文件(如`...

    c++传递参数给python源码.rar

    这通常涉及到编写Python的`extension module`,使用`PyType_Ready`、`PyModule_AddObject`等API来注册和暴露C++类。 5. **list参数**: C++中的`std::vector`或`std::list`可以转换为Python的`list`。创建一个空的...

    使用C++扩展Python功能的方法.pdf

    在混合编程中,我们可以通过两种方式来使用C++扩展Python功能:拓展(Extension)和嵌入(Embedding)。拓展指的是将C++作为系统语言,来拓展Python模块的功能,并在Python环境中使用这些模块。嵌入则是将Python解释...

    VCForPython27.msi

    3. **Python C Extension Modules**:Python的许多高效库,如科学计算库NumPy和图像处理库PIL,都是用C或C++编写的,它们以扩展模块的形式存在于Python中。这些模块需要C++编译器来编译源码,从而生成能够在Python...

    Python调用C++程序的方法详解

    【Python调用C++程序的方法详解】 Python调用C++程序是提高性能和利用现有C++库的一个常见需求。Python的灵活性和C++的高效性相结合,能够为开发者提供一个强大的混合开发环境。以下是几种Python调用C++程序的主要...

    cython_c++_to_python_example.zip

    在IT行业中,有时候我们需要将高效的C++代码与Python语言相结合,以利用Python的易用性和C++的高性能。"cython_c++_to_python_example.zip"这个压缩包提供了一个具体的案例,展示了如何通过Cython将C++代码转换为...

    windows下编译工具Microsoft Visual C++ Compiler for Python VCForPython

    在windows平台上安装python c extension的扩展包是件很痛苦的事情,一般通过安装vc/vs系列来编译C扩展,不过安装包都比较大。或者通过mingw编译。微软为Python提供了专用的编译器Microsoft Visual C++ Compiler for ...

    使用C++扩展Python功能的方法1

    1. **拓展(Extension)**:通过C++编写模块,然后在Python中导入和使用。这通常涉及到使用Python的C API,创建Python模块,暴露C++函数给Python调用。 2. **嵌入(Embedding)**:将Python解释器集成到C++应用程序...

    Python ISAPI Extension for IIS-开源

    **Python ISAPI Extension for IIS 开源项目详解** 在IT领域,Web服务器的性能和灵活性是决定应用程序效率的关键因素之一。对于使用Python进行Web开发的程序员来说,将Python与Microsoft IIS(Internet Information...

    sip for python

    One of the features of Python that makes it so powerful is the ability to take existing libraries, written in C or C++, and make them available as Python extension modules. Such extension modules are ...

    Windows系统Python直接调用C++ DLL的方法

    1,打开 VS 2019,新建C++ Windows 动态链接库工程 Example,加入下列文件,如果Python是64位的则在VS中 Solution platforms 选择 x64 编译成64位的 DLL; Example.h #pragma once #ifndef CPP_EXPORTS #define ...

    解决error: Microsoft Visual C++ 14.0 or greater is required. BUG的文

    解决安装某些python包**error: Microsoft Visual C++ 14.0 or greater is required. BUG**报错的文件

    使用C(C++)扩展 Python(中文文档)

    ### 使用C(C++)扩展Python(中文文档) #### 1. 一个简单的例子 本文档将指导您如何使用C/C++语言来扩展Python的功能。通过这种方式,您可以利用C/C++的强大性能来实现Python难以完成的任务,比如直接调用C库函数...

    Make成python可以调用的.so文件。

    在Python编程中,有时我们需要利用C++的高效性能或者调用已有的C++库来扩展Python的功能。这种情况下,我们通常会使用Cython或者SWIG等工具将C++代码编译为Python可以调用的动态链接库(.so文件,Linux下的动态库,...

    Python调用C函数实例

    在Python编程中,有时我们需要利用C或C++的高性能特性,这时就需要进行Python与C/C++的混编。本文将详细讲解如何在Python中调用C函数,包括值传递、指针传递和数组的处理。 首先,理解Python的C API是关键。Python...

    VSCODE C/C++ 插件离线包

    首先,我们要明确的是,"VSCODE C/C++ 插件离线包"是指针对VSCODE专门用于编写C和C++程序的扩展插件的离线安装版本。这个插件的主要作用是为VSCODE提供对C和C++语言的语法高亮、代码补全、调试等强大功能,极大地...

Global site tag (gtag.js) - Google Analytics