设为首页 收藏本站
查看: 1634|回复: 1

[经验分享] Python嵌入D

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-4-21 12:35:16 | 显示全部楼层 |阅读模式
  所有的嵌入都研究了一个遍。发现嵌入Python挺好,试试。
  用D写Python的扩展,已经有了pyD,非常好用,效率也很高,http://pyd.dsource.org
  将Python嵌入D,只能使用Raw的C-API了。这里用到了pyD中的Python接口文件
  python.d和python25_digitalmars.lib,并且在本机安装了Python2.5
  1.简单的高层次嵌入:就是执行一个Python的脚本

import python;
void main()
{
Py_Initialize();

PyRun_SimpleString("from time import time,ctime\n"
"print('Today is:',ctime(time()))\n");
Py_Finalize();
}
  2.低层次嵌入:修改了一个C的例子,在D中调用Python函数,并返回值。python脚本和调用写在注释了。

import python;
import std.stdio,std.string,std.c.string;
//call: t sm mw 2 3
/*
'''sm.py'''
def mw(a,b):
print 'Will compute',a,'times',b
c=0
for i in range(0,a):
c=c+b
return c
*/
void main(char[][] argv)
{
PyObject * pName,pModule,pDict,pFunc;
PyObject *pArgs, pValue;
int i,argc;
argc = argv.length;
if (argc < 3) {
printf("Usage: call pythonfile funcname [args]\n");
return 1;
}
printf("args:%d\n",argc);
Py_Initialize();
pName = PyString_FromString( toStringz(argv[1]) );
/* Error checking of pName left out */
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != null) {
pFunc = PyObject_GetAttrString(pModule, toStringz(argv[2]));
/* pFunc is a new reference */
if (pFunc && PyCallable_Check(pFunc)) {
pArgs = PyTuple_New(argc - 3);
//set args
for (i = 0; i < argc - 3; ++i) {
pValue = PyInt_FromLong(atoi(argv[i + 3]));
if (!pValue) {
Py_DECREF(pArgs);
Py_DECREF(pModule);
printf("Cannot convert argument\n");
return 1;
}
/* pValue reference stolen here: */
PyTuple_SetItem(pArgs, i, pValue);
}
//call function
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs); //release args
if (pValue != null) {
printf("Result of call: %ld\n", PyInt_AsLong(pValue));
Py_DECREF(pValue); //release return
}
else {
Py_DECREF(pFunc); //
Py_DECREF(pModule);
PyErr_Print();
printf("Call failed/n");
return 1;
}
}
else {
if (PyErr_Occurred())
PyErr_Print();
printf( "Cannot find function \"%s\"\n", argv[2]);
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
else {
PyErr_Print();
printf("Failed to load \"%s\"\n", argv[1]);
return 1;
}
Py_Finalize();
return 0;
}

  关键的是在合适的时机释放Python的变量。自己也写了个简单的封装。比较而言,最简单的还是MiniD的嵌入,其次是Lua,Python的比较复杂。Python的好处是类库丰富,几乎要什么有什么。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-367423-1-1.html 上篇帖子: Python IDE简介 下篇帖子: Python and RRD
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表