在python中公开c,的python

发布时间:2022-11-17

本文目录一览:

  1. 如何让python调用C和C++代码
  2. Python和C哪个更好学
  3. c如何调用python程序
  4. 如何通过Boost.Python在Python中使用C++类和函数
  5. 如何在Python中使用C/C++结构体等复杂类型
  6. python语言的特点

如何让python调用C和C++代码

如何让python调用C和C代码 安装python后,会有一个chm格式的python手册。要搞明白如何让python调用C/C代码(也就是写python的 extension),你需要征服手册中的 Extending embedding厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在Python Programming On Win32书中找到了教程。 下面记录一下如何在visual studio 2005中,写一段C/C++的MessageBox代码,然后提供后python调用,最后的结果当然是显示一个MessageBox.

  1. 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c代码,不一定是c/c代码,可以是其他语言写的代码)是一个 dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:\Program Files\Python25\DLLs),假如我们接下来要写的扩展module名为mb,python调用的代码为: import mb mb.showMsg("Python's really amazing, I kindda love it!") python怎么找到我们的mb模块呢?就是上面说的,我们要生成一个mb.dll,然后拷贝到Dlls目录下面,为了区别普通的dll和python专用扩展的dll,我们的 mb.dll修改成mb.pyd(python dll)
  2. 搭建环境,我们要使用python提供的c头文件和lib库来进行扩展的开发。 在vs 2005下点击菜单 "工具"-"选项", 打开选项对话框,选择"项目和解决方案-VC++目录", 然后在右边"显示以下内容的目录"得comboBox上选择"包含文件”,添加python的include目录(我的机器上是"F:\Program Files\Python25\include"),然后选择库文件,添加python的libs目录(我的机器上是"F:\Program Files\Python25\libs")。 既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码:
#include python.h //python.h是包含python一些定义的头文件,在python的include目录下
/*
我的python版本是2.5, 因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll,
想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息
*/
#pragma comment(lib, "python25.lib")
//先不管
static PyObject* mb_showMsg(PyObject* self, PyObject *args);
/*
如果你的扩展是mb,那么必须实现一个initmb函数,并且从dll中导出这个函数,但我们在python中调用import mb时,python会去dll里去调用
initmb函数,这个函数告诉python我们有些什么函数,该怎么告诉python我们有一个showMsg函数呢?下面详解
*/
//必须extern "C"下,这样不会在C++编译器里不会更改掉导出的函数名字,我第一次就犯了这样的错误
extern "C" __declspec(dllexport) void initmb() {
/*
当调用mb.showMsg("Python's really amazing, I kindda love it!")时,
相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式,
定义一个字典数据结构,key = showMsg, value =mb_showMsg,METH_VARARGS是函数调用方式,仔细查手册吧
*/
    static PyMethodDef mbMethods[] = {
        {"showMsg", mb_showMsg, METH_VARARGS},
        {NULL, NULL, NULL} /*sentinel,哨兵,用来标识结束*/
    };
    //告诉python我们的模块名叫mb, 模块包含的函数都在mbMethods字典里
    PyObject *m = Py_InitModule("mb", mbMethods);
}
/*
接下来实现核心功能showMsg
*/
//第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple
static PyObject* mb_showMsg(PyObject* self, PyObject *args) {
    //我们的showMsg函数需要的是一个字符串参数
    const char* msg = NULL;
    /*
    调用特殊参数解码python传递给我们的参数,s是string,我们传递接收参数的变量地址,
    如果你的功能函数需要两个参数,在PyArg_parseTuple后面继续添加接受参数的变量地址,
    这个函数的原型是类似printf的不定参数的形式
    PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...);
    */
    if (!PyArg_ParseTuple(args, "s", msg)) return NULL;
    //调用MB
    int r = ::MessageBox(NULL, "hello", "Caption:Form C module", MB_ICONINFORMATION | MB_OK);
    //返回值
    return Py_BuildValue("i", r);
}

将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb.dll,修改后缀成mb.pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码:

import mb
mb.showMsg("Python's really amazing, I kindda love it!")

可以看到弹出来一个MessageBox。

Python和C哪个更好学

Python比C语言更好学。 Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。Python极其容易上手,因为Python有极其简单的说明文档。 C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。

扩展资料:

C语言特有特点:

C语言是普适性最强的一种计算机程序编辑语言,它不仅可以发挥出高级编程语言的功用,还具有汇编语言的优点,因此相对于其它编程语言,它具有自己独特的特点。

  • 广泛性C 语言的运算范围的大小直接决定了其优劣性。C 语言中包含了34种运算符,因此运算范围要超出许多其它语言,此外其运算结果的表达形式也十分丰富。
  • 此外,C 语言包含了字符型、指针型等多种数据结构形式,因此,更为庞大的数据结构运算它也可以应付。
  • 简洁性。9 类控制语句和32个KEYWORDS是C语言所具有的基础特性,使得其在计算机应用程序编写中具有广泛的适用性,不仅可以适用广大编程人员的操作,提高其工作效率,同时还能够支持高级编程,避免了语言切换的繁琐。
  • 结构完善。C语言是一种结构化语言,它可以通过组建模块单位的形式实现模块化的应用程序,在系统描述方面具有显著优势,同时这一特性也使得它能够适应多种不同的编程要求,且执行效率高。

Python特点:

  • 解释性,运行程序的时候,连接、转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。
  • 在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单。也使得Python程序更加易于移植。
  • Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。
  • 可扩展性,如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。
  • 可嵌入性,可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。

c如何调用python程序

C语言如何调用python,相关步骤如下:

  • 首先,C语言中调用python,要使用头文件Python.h。
  • 接着,定义一个调用python的函数。
  • 相关推荐:《Python教程》
  • 函数中,设置python库的路径。
  • 然后,初始化python。
  • 运行一个python代码,输出How are you。
  • 最后,释放python。

如何通过Boost.Python在Python中使用C++类和函数

(1)从Boost官方网站下载Boost库源文件,将其解压至某一目录中。 (2)将Boost解压至的目录添加到VC++ 6.0的【Include files】中, (3)进入Boost目录下的“libs\python\build\VisualStudio”子目录中,在VC++ 6.0中打开其中的“boost_python.dsw”文件。 (4)单击【Build】|【Batch Build】命令,分别编译Boost.Python的Debug和Release版。 (5)编译完成后将在Boost目录下的“libs\python\build\bin-stage”子目录中生成动态链接库和库文件。由于使用Boost.Python编写的Python扩展在运行时根据版本不同需要“boost_python.dll”和“boost_python_debug.dll”文件。为了方便,可以将其放到Windows安装目录下的“system32”目录下。否则,需要将其和Python扩展放在同一目录中。 (6)将Boost目录下的“libs\python\build\bin-stage”子目录添加到VC++ 6.0的【Library files】中, 完成上述设置后就可以使用Boost.Python编写Python扩展了。 使用Boost.Python扩展和嵌入Python 通过Boost.Python可以在Python内使用C++类和函数。和SWIG一样Boost.Python简化了编写Python扩展的代码,而不用使用Python/C API。但与SWIG不同,Boost.Python是一个类库,无需再使用接口文件。

初始化和方法列表

在Boost.Python中可以通过使用BOOST_PYTHON_MODULE来命名模块名。在BOOST_PYTHON_MODULE中则可以使用def来实现使用Python/C API定义的方法列表。以下是一个简单的例子。

void show() //声明show函数
{
    cout << "Boost.Python";
}
BOOST_PYTHON_MODULE(example) //使用BOOST_PYTHON_MODULE命名模块名为“example”
{
    def("show",show); //相当于定义方法列表
}

以上就是对如何编译Boost.Python以及如何使用Boost.Python扩展和嵌入Python的相关的内容的介绍,望你会有所收获。

如何在Python中使用C/C++结构体等复杂类型

如果你的c对象是已有的代码,可以用cpython包装成Python对象,这些cpython包装的对象有一个指针是指向你要包装的c对象的,然后提供访问c++对象的方法。

python语言的特点

python语言的特点有:

  1. 可移植性:由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。
  2. 简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。
  3. 免费、开源:Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。
  4. 可扩展性、可扩充性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。
  5. 可嵌入性:可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。