使用ctypes调用C共享库中函数返回值为链表式结构时的方法

/*********************************************************************
 * Author  : Samson
 * Date    : 02/02/2015
 * Test platform:
 *              3.13.0-24-generic
 *              GNU bash, 4.3.11(1)-release
 * *******************************************************************/

C共享库中存在这样的函数:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define true 1

#define false 0

typedef struct user_server_list{

char servername[64];

char server_status; /* on: true off:flase*/

char server_manual_start;  /* enable: true  disable: false*/

struct user_server_list *next;

}Struct_server_list, *P_Struct_server_list;

int add(int a, int b)

{

int c = a + b;

return c;

}

P_Struct_server_list get_server_list()

{

P_Struct_server_list p = malloc(sizeof(Struct_server_list));

memset(p, 0, sizeof(Struct_server_list));

strcpy(p->servername, "ssh");

p->server_status = true;

p->server_manual_start = false;

P_Struct_server_list p2 = malloc(sizeof(Struct_server_list));

memset(p2, 0, sizeof(Struct_server_list));

strcpy(p2->servername, "cmd");

p2->server_status = true;

p2->server_manual_start = false;

p->next = p2;

p2->next = NULL;

return p;

}

使用gcc -g -fPIC -shared -o libhelloworld.so.0.0.0 test.c编译成动态库;

然后编写python调用程序,代码如下:

#!/bin/env python

# coding=UTF-8

from ctypes import *

class StructPointer(Structure):

pass

StructPointer._fields_=[("servername", c_char * 64), ("server_status", c_char), ("server_manual_start", c_char), ("next", POINTER(StructPointer))]

lib = cdll.LoadLibrary(‘./libhelloworld.so.0.0.0‘)

lib.get_server_list.restype = POINTER(StructPointer)

p = lib.get_server_list()

print p.contents.servername

p2=p.contents.next[0]

print p2.servername

执行结果为:

[email protected]:~$ python testpython.py

ssh

cmd

时间: 2024-12-12 14:23:04

使用ctypes调用C共享库中函数返回值为链表式结构时的方法的相关文章

C语言中函数返回值的问题

c语言中有关于在函数返回值的问题,在函数中的局部变量主要是在栈上开辟的,出了函数变量就被回收了,针对函数返回值得问题,给出下面几个比较具体的例子来说明: 函数返回值是在函数中定义的局部变量 这类型的返回值在主函数中是可以使用的,因为返回局部变量值得时候,返回的是值得一个副本,而在主函数中我们需要的也只是这个值而已,因此是可以的,例如 int fun(char *arr) { int num = 0; while (*arr != '\\0') { num = num * 10 + *arr -

lua入门之二:c/c++ 调用lua及多个函数返回值的获取

当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结果的个数(the  function  returns  (in  C)  the  number  of  results  it  is leaving on the stack.). // luacallcpp.cpp : 定义控制台应用程序的入口点. // #include "stdafx.

shell中函数返回值

1.前言 快半年没有写博客了,荒废了很久,工作中的杂事太多,自己越来越懒了.为了鞭策自己成长,还是要坚持写写博客,记录自己的成长. 2.shell函数介绍 语法: [ function ] funname [()] { action; [return int;] } 说明: (1)可以带function fun()  定义,也可以直接fun() 定义,不带任何参数. (2)参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. return后跟数值n(0-25

SWIFT中函数返回值为Tuple

在playgroundm内键入以下代码,求一个成绩数组内最大分值和最小分值 func maxminScore(scores:Array<Int>) -> (maxScore:Int,minScore:Int)? { //一个可以空的Tuple if scores.isEmpty{ return nil  //判断是否有值,没值就返回一个空值 } var maxScore = scores[0], minScore = scores[0] for score in scores[1..&l

python学习之函数返回值

python中函数返回值的方式有2种: 1.return语句 说明:return语句执行完后,函数后续的代码将不会被执行 2.yield语句 说明:yield语句返回的是一个迭代器对象,可以通过next(a)(a为函数的实例对象)来调用. yield后面的代码照样不会被执行. >>> def a(): ... for i in range(1,3): ... yield i ... print('over') ... >>> a() <generator obje

[Python] Python 调用 C 共享库

Linux/Unix 平台下共享库(Shared Library)文件后缀 .so:在 Windows 平台称为动态链接库(Dynamic Link Library),文件名后缀为 .dll. 利用 ctypes 模块调用 C 共享库 ctypes 是 Python 标准库提供的一个模块,Python 2.3 版本以上支持该模块.ctypes 是 Python 高级外部函数接口,Python 通过它可以调用 C 语言编译的静态链接库和动态链接库.ctypes 支持多个平台,包括 Windows,

共享库中的位置无关代码(PIC)

原作者:Eli Bendersky http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/ 在之前的文章里我已经描述过在将共享库载入程序地址空间时需要特殊的处理.简而言之,在链接器创建共享库时,它不能预先知道这个库将在哪里载入.这给在库里访问数据与代码带来了麻烦,应该使得这些访问指向正确的内存位置. 在Linux ELF共享库里解决这个问题有两个主要途径: 1.     

Javscript调用iframe框架页面中函数的方法

Javscript调用iframe框架页面中函数的方法,可以实现iframe之间传值或修改值了, 访问iframe里面的函数: window.frames['CallCenter_iframe'].hw_CallIn(callerid,sessionid); 说明: CallCenter_iframe为iframe的id hw_CallIn为iframe中页面中的方法名 callerid和sessionid为方法中的参数 例子如下:index.html <a href="#" o

对象做函数参数和函数返回值时,调用复制构造函数,构造函数,析构函数的情况

// 对象做函数参数和返回值.cpp : 定义控制台应用程序的入口点.//exit(0)表示正常退出程序,exit(0)表示异常退出 //在调用input时,编译器用对象A去创建了形参对象temp,调用了复制构造函数,对象A中的数据复制给了对象temp// 在input函数中,执行temp.set(s),为对象temp中数据成员str申请了动态储存空间,并设置了输入的字符串//并没有改变实参A中的数据成员str的储存空间,故在执行语句A.show()后输出的字符串并没有改变.在函数调用结束后 /