php下载站源码长沙专业做网络的公司

diannao/2026/1/25 9:09:23/文章来源:
php下载站源码,长沙专业做网络的公司,邯郸网站制作建设,成品短视频app下载有哪些软件好C使用ffpython嵌入和扩展python#xff08;python2和python3#xff09;摘要:在服务器编程中#xff0c;经常会用到python脚本技术。Python是最流行的脚本之一#xff0c;并且python拥有定义良好的C API接口#xff0c;同时又有丰富的文档#xff0c;与C结合非常的适合。…C使用ffpython嵌入和扩展pythonpython2和python3摘要:在服务器编程中经常会用到python脚本技术。Python是最流行的脚本之一并且python拥有定义良好的C API接口同时又有丰富的文档与C结合非常的适合。通常情况下使用C封装机制而用python脚本实现策略或者是控制。使用python和C结合的技术拥有如下优势主体系统使用C实现保持系统的高效。控制部分使用python增加开发效率python的内存垃圾回收丰富的类库都使C开发者获益匪浅。Python脚本可以运行期重载可以实现控制部分不停机热更新。C与python的编程范式有很大不同当使用python C API调用python时python中的一些特有机制会给C开发者带来很多困惑。常常使用python C API时需要注意如下几点:Python 使用引用计数管理内存调用python C API时对于返回值返回的是借用的引用还是新的引用需要根据文档仔细确认。否则轻则出现内存泄露重则程序崩溃。Python中的数据结构与C的有很大不同。Python常用的有tuplelistdict。而c常用的事vectorlistmap并且c是强类型的。当c与python进行交互时C层希望操作python数据结构就像操作c STL一样方便而在python脚本层又希望c传入的参数或返回值都是原生的python数据C中常用的指针传递对象当嵌入python时需要把c对象传递到python中。 ffpython是专门方便C嵌入python开发的类库基于ffpython一方面可以轻松的将python集成到C系统另一方面C对象或接口也可以很容易被python使用总之ffpython简化了c与python的交互操作。嵌入python最简单的使用python的方式是把python脚本当作配置如获取脚本中的一个字符串变量。Python的脚本文件会被python虚拟机import为module和python的标准库的module实际上是相似的概念。ffpython封装了获取python module中的变量的操作。printf(sys.version%sn, ffpython.get_global_varstring(sys, version).c_str()); 上面的代码获取python标准库中sys的version变量值ffpython通过模板函数的自动将python的str类型自动适配到c的string类型。get_global_var是获取变量的接口与之对应的是设置变量的借口get_global_varffpython.get_global_var(fftest, global_var, OhNice); printf(fftest.global_var%sn, ffpython.get_global_varstring(fftest, global_var).c_str()); 调用python函数是嵌入python非常常用的操作ffpython中提供了call接口用于调用python中的module的函数printf(time.asctime%sn, ffpython.callstring(time, asctime).c_str()); 上面的代码调用time模块的asctime方法我们也可以使用call接口调用我们自己编写的函数int a1 100; float a2 3.14f; string a3 OhWell; ffpython.callvoid(fftest, test_base, a1, a2, a3); Call被定义为模版函数传入的参数会自动适配到python相应的类型。对应的python函数为def test_base(a1, a2, a3):print(test_base, a1, a2, a3)return 0 上面的python函数接受三个参数c传入了三个标准类型参数实际上call接口最多支持9个泛型参数常用的stl 参数是被支持的void test_stl(ffpython_t ffpython) {vectorint a1;a1.push_back(100);a1.push_back(200);liststring a2; a2.push_back(Oh);a2.push_back(Nice);vectorliststring a3;a3.push_back(a2);ffpython.callbool(fftest, test_stl, a1, a2, a3); } 对应调用的python函数为def test_stl(a1, a2, a3):print(test_stl, a1, a2, a3)return True 不但STL泛型被支持嵌套定义的类似vector 的结构都是被支持的vector和list都会转换成python的list结构而map则转换为dict结构。调用call接口必须指定接收的返回值类型可以使用void忽略返回值除了可以使用标准类型stl接口也可以被使用python中的tuple和list可以转换成vector和listdict则可以被转换成map。需要注意的是若类型没有匹配call函数将会抛出异常。用户可以catch标准异常what接口返回的字符串包含了异常的traceback信息方便排查错误。示例如下try{......}catch(exception e){printf(exception traceback %sn, e.what());}扩展pythonffpython 可以注册static函数到python中全局的C风格的static函数和类中定义的static函数都可以被注册到python中示例如下 static int print_val(int a1, float a2, const string a3, const vectordouble a4) {printf(%s[%d,%f,%s,%d]n, __FUNCTION__, a1, a2, a3.c_str(), a4.size());return 0; } struct ops_t {static listint return_stl(){listint ret;ret.push_back(1024);printf(%sn, __FUNCTION__);return ret;} };std::string test_reg_function(ffpython_t ffpython) {ffpython.reg(print_val, print_val).reg(ops_t::return_stl, return_stl);ffpython.reg_classfoo_t, PYCTOR(int)(foo_t).reg(foo_t::get_value, get_value).reg(foo_t::set_value, set_value).reg(foo_t::test_stl, test_stl).reg_property(foo_t::m_value, m_value);ffpython.reg_classdumy_t, PYCTOR(int)(dumy_t, dumy_t class inherit foo_t ctor int, foo_t).reg(dumy_t::dump, dump);ffpython.reg(obj_test, obj_test);return cppext; } 以上代码注册了两个接口给python然后调用fftest文件中的test_reg_function测试两个接口fftest.py中定义测试代码def test_reg_function():import ext1ext1.print_val(123, 45.6 , ----789---, [3.14])ret ext1.return_stl()print(test_reg_function, ret) 这两个接口虽然简单但是说明了ffpython注册的接口支持多个参数参数类型可以是标准C类型也可以是STL泛型。同样返回值的类型也是如此。使用ffpython 注册C的对象也很容易ffpython支持注册c类的构造函数成员变量成员方法到python示例代码如下class foo_t { public:foo_t(int v_):m_value(v_){printf(%sn, __FUNCTION__);}virtual ~foo_t(){printf(%sn, __FUNCTION__);}int get_value() const { return m_value; }void set_value(int v_) { m_value v_; }void test_stl(mapstring, listint v_) {printf(%sn, __FUNCTION__);}int m_value; };class dumy_t: public foo_t { public:dumy_t(int v_):foo_t(v_){printf(%sn, __FUNCTION__);}~dumy_t(){printf(%sn, __FUNCTION__);}void dump() {printf(%sn, __FUNCTION__);} };static foo_t* obj_test(dumy_t* p) {printf(%sn, __FUNCTION__);return p; } 当c类型被注册到python中后python中使用该类型就像python内建的类型一样方便需要注意的是如果python中动态的创建了c对象那么他是被python的GC管理生命周期的所以当变量不在被引用时c对象的析构函数被调用。对应的fftest.py中测试的脚本代码为def test_register_base_class():import ext2foo ext2.foo_t(20130426)print(test_register_base_class get_val:, foo.get_value())foo.set_value(778899)print(test_register_base_class get_val:, foo.get_value(), foo.m_value)foo.test_stl({key: [11,22,33] })print(test_register_base_class test_register_base_class, foo) 同前边所诉的原则相同支持C 标准内建类型和STL 泛型。当这个python函数返回时foo_t的析构函数会被调用。dumy_t是foo_t的子类。使用ffpython可以方便表示两个类型的关系。如果基类已经定义的接口子类不需要重复定义比如要注册子类ffpython.reg_classdumy_t, PYCTOR(int)(dumy_t, dumy_t class inherit foo_t ctor int, foo_t).reg(dumy_t::dump, dump);void test_register_inherit_class(ffpython_t ffpython) {ffpython.callvoid(fftest, test_register_inherit_class); }; 只需要单独注册一下子类特有的接口其他接口自动从foo_t基类中继承而来相应的测试python脚本代码为def test_register_inherit_class():import ext2dumy ext2.dumy_t(20130426)print(test_register_inherit_class get_val:, dumy.get_value())dumy.set_value(778899)print(test_register_inherit_class get_val:, dumy.get_value(), dumy.m_value)dumy.test_stl({key: [11,22,33] })dumy.dump()print(test_register_inherit_class, dumy) ffpython中一个非常用用的特性是c创建的对象可以传递到python中而python使用起来就像正常的python对象一样另外python创建的c对象也可以传递到c中简单示例代码ffpython.reg(obj_test, obj_test);void test_cpp_obj_to_py(ffpython_t ffpython) {foo_t tmp_foo(2013);ffpython.callvoid(fftest, test_cpp_obj_to_py, tmp_foo); }void test_cpp_obj_py_obj(ffpython_t ffpython) {dumy_t tmp_foo(2013);foo_t* p ffpython.callfoo_t*(fftest, test_cpp_obj_py_obj, tmp_foo); } 相应的fftest.py中的测试脚本代码为def test_cpp_obj_to_py(foo):import ext2print(test_cpp_obj_to_py get_val:, foo.get_value())foo.set_value(778899)print(test_cpp_obj_to_py get_val:, foo.get_value(), foo.m_value)foo.test_stl({key: [11,22,33] })print(test_cpp_obj_to_py test_register_base_class, foo)def test_cpp_obj_py_obj(dumy):import ext2print(test_cpp_obj_py_obj get_val:, dumy.get_value())dumy.set_value(778899)print(test_cpp_obj_py_obj get_val:, dumy.get_value(), dumy.m_value)dumy.test_stl({key: [11,22,33] })dumy.dump()ext2.obj_test(dumy)print(test_cpp_obj_py_obj, dumy)return dumy 总结ffpython 支持c调用python函数获取和设置模块内的变量ffpython call接口最多支持9个泛型参数支持的类型包括c内建的类型和STL 泛型。以及已经被注册的c类的指针类型。返回值的类型约束同样如此。c STL中的vector和list对应于python的tuple和listmap类型则对应于dict。ffpython支持将c的静态函数注册到python中。ffpython支持c类的注册并且支持继承。Python中操作c对象就像操作原生python对象一样。ffpython注册的c类在python中被创建后将会由python GC负责回收内存。ffpython 类库只有一个文件并且不依赖其他第三方库非常容易集成到项目中。而且ffpython遵从开源协议。ffpython使用c模板技术封装了python C API的使用细节保持精巧和简洁效率和完全的python C API编写的代码几乎相同。ffpython的实现可以作为非常好的python C API的示例。Github项目地址https://github.com/fanchy/ffpython 更多文章 http://h2cloud.org

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/88359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做食品那些网站好网站如何做的看起来高大上

创建一个简单的iOS天气应用程序涉及到多个步骤,包括设置项目、编写代码和使用外部API。由于篇幅限制,我将提供一个基础的示例,这个例子会展示如何创建一个简单的UI,获取用户的当前位置,并从OpenWeatherMap API获取天气…

网站源码在线查询北京网站搭建费用

在学习和使用python的过程中,少不了要与python idle打交道。但使用python idle都会遇到一个常见而又懊恼的问题——要怎么清屏?我在stackoverflow看到这样两种答案:1.在shell中输入1 import os 2 os.system(cls) 这种方法只能在windows系统中cmd模式下的…

网站项目功能需求清单滑县网站建设策划

今日学习的文章链接和视频链接 leetcode题目地址:383. 赎金信 代码随想录题解地址:代码随想录 题目简介 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返…

做淘宝客网站有什么服务器上哪儿找做网站

今天给大家分享一个微软官方的好东西:Channel。前言今天给大家分享一个微软官方的生产者/消费者方案的特性解决:Channel。Channel在System.Threading.Channels命名空间下,Core 2.1使用时,需要从Nuget上安装。% dotnet add package…

中国石油天然气第六建设公司网站a5站长网网站交易

文章目录 为不同的场景设计合适的缓存策略1. 缓存是什么2. 缓存的场景3. 缓存的策略4. 缓存位置5. 缓存实现的要点6. 注意问题7. 使用的组件8. 内存缓存和分布式缓存区别 总结 为不同的场景设计合适的缓存策略 1. 缓存是什么 缓存是计算结果的“临时”存储和重复使用缓存本质…

网站设计需求方案wordpress注册新用户

那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂。 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型。(用来传递数字的类型有int、float、double,用…

淮南网站建设服务中国建设银行太原招聘信息网站

JAVA中断线程的方法 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的! 现在,如果你要安全有效地终止一个线程,应该采用以下这些方法&a…

广告公司企业网站模板优化 导航网站

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网的广泛渗透和进步,基于网络技术的KTV点歌系统迅速壮大,其发展始终围绕用户的实际需求展开。通过深入洞察用户的需求,开发出高度定制的管理平台,利用网络的便捷性对系统…

杭州网站建设seo怎么查网站哪里做的

我们公司在用nginx的userid模块作为简单的用户请求追踪使用。这个模块其实并不能真正记录用户的请求状态,只能作为一个辅助使用。但是在一些场景下会有一些异常。下面我们简单介绍一下这个模块到底做了什么。 userid 模块简介 官网说明文档 ngx_http_userid_modul…

龙华区网站建设政元软件做网站

文章目录一、JDBC下载与导入二、获取连接三、PreparedStatement类操作数据库四、操作BLOB类型字段(图片视频等)五、Batch批量插入🙆🏻‍♀️🙆🏻‍♀️文末最新版jdbc jar包下载 🙆&#x1f3fb…

网站备案号 如何添加目前网站开发应用到的技术有什么

JVM(Java虚拟机)是Java平台的核心组件之一,它是一个虚拟计算机,可以执行Java字节码文件。JVM解释并执行Java字节码,并提供了其他功能,如内存管理和垃圾回收。 JVM的基本功能包括以下几个方面: …

wordpress建立移动站能源门户网站建设

1、stack容器(栈) 1.1 栈stack基本概念 概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口 栈中只有顶端的元素才可以被外界调用,因此栈不允许有遍历行…

cms网站官方网站包括哪几个网站

当你审查别人的代码时,你会寻找什么? 无论你是通过像 Upsource 这样的工具来审查代码,还是在同事讲解他们代码的过程中进行审查,在任何情况下,有些事情都比其他事情更容易评论。比如: 格式:空…

长春制作手机网站自己制作的网页别人如何访问

嵌入式人工智能----最热门的人工智能商业化技术之一 “嵌入式人工智能是当前最热门的人工智能商业化技术之一。所谓嵌入式人工智能,就是设备无须通过云端数据中心进行大规模计算,而是在本地、不联网的情况下就可以做到实时环境感知、人机交互、决策控制…

建怎样的网站挣钱快百度seo关键词优化si

目录 前言:什么是JDBC 一、准备工作(一):MySQL安装配置和基础学习 二、准备工作(二):下载数据库对应的jar包并导入 三、JDBC基本操作 (1)定义记录的类(可选) (2)连接的获…

网站开发可行性街区网站建设

《金融保险会计》模拟题 单选题 1.下列不符合外汇分账制基本要求的有(). A.对各种外币的收付凡有人民币牌价的平时都按原币填制凭证登记账簿编制报表 B.对各种外币的收付凡有人民币牌价的平时都按人民币填制凭证登记账簿编制报表 C.设置”外汇买卖”科目 D.各种外币分别设置一…

网站搭建类型海报设计网站免费

今天我们来聊一聊 C# 中的本地函数。本地函数是从 C# 7.0 开始引入,并在 C# 8.0 和 C# 9.0 中加以完善的。引入本地函数的原因我们来看一下微软 C# 语言首席设计师 Mads Torgersen 的一段话:Mads Torgersen:我们认为这个场景是有用的 —— 您…

网站模板安装出现预先建设数据库各种网站开发工具

电源、时钟、复位是主板能正常工作的三大要素。主板在电源、时钟都正常后,复位系统发出复位信号,主板各个部件在收到复位信号后,同步进入初始化状态。如图7-11所示为复位电路的工作原理图,各个十板实现复位的电路不尽相同&#xf…

怎么制作网站上传wordpress 随机显示

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 1. 法一:指针法 解题思路 我们以每一个窗口来看,找…

免费商城网站模板企业网站建设及维护费用

博物馆是人们了解历史文化、传承文明的重要场所。而博物馆的藏品管理是博物馆的核心工作之一,对于展现博物馆的魅力、吸引观众的眼球有着至关重要的影响。并且博物馆藏品管理是一项复杂且专业的工作,它涉及到多个方面,包括但不限于藏品的收集…