项目记录 -- python调用回调函数

C源文件:

 1 static int
 2 get_callback(zpool_handle_t *zhp, void *data)
 3 {
 4     zprop_get_cbdata_t *cbp = (zprop_get_cbdata_t *)data;
 5     char value[MAXNAMELEN];
 6     zprop_source_t srctype;
 7     zprop_list_t *pl;
 8
 9     for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
10
11         /*
12          * Skip the special fake placeholder. This will also skip
13          * over the name property when ‘all‘ is specified.
14          */
15         if (pl->pl_prop == ZPOOL_PROP_NAME &&
16             pl == cbp->cb_proplist)
17             continue;
18
19         if (pl->pl_prop == ZPROP_INVAL &&
20             (zpool_prop_feature(pl->pl_user_prop) ||
21             zpool_prop_unsupported(pl->pl_user_prop))) {
22             srctype = ZPROP_SRC_LOCAL;
23
24             if (zpool_prop_get_feature(zhp, pl->pl_user_prop,
25                 value, sizeof (value)) == 0) {
26                 zprop_print_one_property(zpool_get_name(zhp),
27                     cbp, pl->pl_user_prop, value, srctype,
28                     NULL, NULL);
29             }
30         } else {
31             if (zpool_get_prop(zhp, pl->pl_prop, value,
32                 sizeof (value), &srctype) != 0)
33                 continue;
34
35             zprop_print_one_property(zpool_get_name(zhp), cbp,
36                 zpool_prop_to_name(pl->pl_prop), value, srctype,
37                 NULL, NULL);
38         }
39     }
40     return (0);
41 }
42 来源 -- illumos/usr/src/cmd/zpool/zpool_main.c

上面代码中:value定义的是数组char value[MAXNAMELEN];,我采用的方法如下:

1 value = c_char * 256
2
3 libzfs.zpool_get_prop(zhp, prop, value, 256, byref(srctype))

采用上述方法时,当运行到libzfs.zpool_get_prop时,直接显示为None

正确的方法为:

1 value = create_string_buffer(256)
2
3 ret = libzfs.zpool_get_prop(zhp, prop, value, 256, byref(srctype))

采用create_string_buffer才能正确显示

执行命令:print(type(value))
              print(dir(value))

显示如下:

<class ‘ctypes.c_char_Array_256‘>
[‘__class__‘, ‘__ctypes_from_outparam__‘, ‘__delattr__‘, ‘__delitem__‘, ‘__dict__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__setitem__‘, ‘__setstate__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘_b_base_‘, ‘_b_needsfree_‘, ‘_length_‘, ‘_objects‘, ‘_type_‘, ‘raw‘, ‘value‘]

项目记录 -- python调用回调函数

时间: 2024-08-27 05:22:48

项目记录 -- python调用回调函数的相关文章

【转】Python调用C函数

原文链接: Python调用C函数 – 快课网http://www.cricode.com/359.html 关键字:Python ctypes,Python调用dll,Python调用C函数为了节省软件开发成本,软件开发人员希望能够缩短的软件的开 发时间,希望能够在短时间内开发出稳定的产品.Python 功能强大,简单易用,能够快速开发应用软件.但是由于 Python 自身执行速度的局限性,对性能要求比较高的模块需要使用效率更高的程序语言进行开发,例如 C 语言,系统的其他模块运用 Pytho

ajax中调用回调函数

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <a href="javascript:void(0);" id="send">test</a> </bo

python 自定义回调函数

回调函数用起来比较爽.特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢 下面贴一个我写的例子 class BaseHandler(object): def crawl(self, url, **kwargs): if kwargs.get('callback'): callback = kwargs['callback'] if isinstance(callback, basestring) and hasattr(self, callback): fun

python调用C函数

是的,我又开始integrate另一个方法~~ 此方法用C++,Python作胶水,供Matlab调用,原来是在Linux上编译运行,我需要把它在Windows x64上跑起来~~ 在Linux平台,Python调用C是通过这样的方式来进行的: var = CDLL('test.so') 其中,.so是Linux上的一种称为共享库的文件,类似于Windows的.dll文件.那么想当然的,在Windows下面要想调用,我们需要把后面的这个文件替换成test.dll. 这个步骤也不难,方法就是在需要

python 调用c函数

Python调用c 一个典型的Python扩展模块至少应该包含三个部分:导出函数.方法列表和初始化函数. 例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 example.c int fact(int n) {         if (n <= 1)         return 1;         else         return n * fact(n - 1); }

python 的回调函数

回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数. 原文地址:https://www.cnblogs.com/tuosir/p/8443470.html

详细记录python的range()函数用法

使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的slide,最后分析一个好玩儿的冒泡程序. 这里记录一下: >>> range(1,5) #代表从1到5(不包含5) [1, 2, 3, 4] >>> range(1,5,2) #代表从1到5,间隔2(不包含5) [1, 3] >>> range(5) #代表从0到5(不包含5) [0, 1, 2, 3,

python调用php函数

由于php不支持多线程,所以想借助python搞一个.1.import subprocessimport time#Simple caller, disguard outputmethod="diao"for i in range(2):time1=time.time()#print i#subprocess.call("php h.php")proc = subprocess.Popen("php h.php " + method, shell

WCF 服务器调用回调函数 单程-双程操作模式:

服务器端Server 实现回调接口Interface定义.客户端实现回调接口Interface实现,从而实现服务器端通过 var channel = OperationContent.Current.GetCallbackChannel</*接口类名*/>(); 获取回调实例对象channel; 通过channel可以在服务器端调用客户端的实现相关回调接口. 在分布式服务器中 实现心跳包的方式绝大部分使用了这种方法. 可轻松 使用 基于双程模式 + delegate 实现 事件驱动型集群分布式