我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python调用Linux c库:cty

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python调用Linux c库:cty

   我在http://jlnsqt.blog.51cto.com/2212965/1405052这篇博客中讲述了匹配URL的一个算法,因项目需要将其封装为动态库,并让python组调用,所以研究了一下ctypes,感觉超级棒,必须记录下来。


   首先介绍一下我的动态库接口。

   动态库结构体:

   
typedef struct _whitelist_tree_node_ {
    uint8_t white_type; //匹配白名单是否结束,代表下一步执行的动作
    uint8_t child_count;                //该节点的子节点个数
    uint8_t child_order[MAX_CHILDS_NUM]; //子节点在childs的位置(起始1)
    struct _whitelist_tree_node_ *childs;   //子节点数组
} whitelist_tree_node;
typedef struct _whitelist_tree_ {
    whitelist_tree_node *root;          //根节点
    unsigned int whitelist_count;       //URL白名单个数
} whitelist_tree, *PUrlWhiteListControl;
                                                                                                                                                                                                                                                                                                                                                    
函数接口:

int InitUrlWhiteList(const char *ini_file, PUrlWhiteListControl *p_control);

int SearchUrlWhiteList(const char *url, PUrlWhiteListControl p_control);


void CloseUrlWhiteList(PUrlWhiteListControl p_control);


   这里不再给出生成动态库方法和各个接口函数的定义,只介绍如何在python中调用。这里假设我动态库的名称为“liburlwhitelist.so”,动态库和python文件在同一目录,或者再引用动态库的时候用绝对路径。

   开始使用ctypes之前,介绍一下ctypes的类型对照:

ctypes typeC typePython type
c_bool_Boolbool (1)
c_charchar1-character string
c_wcharwchar_t1-character unicode string
c_bytecharint/long
c_ubyteunsignedcharint/long
c_shortshortint/long
c_ushortunsignedshortint/long
c_intintint/long
c_uintunsignedintint/long
c_longlongint/long
c_ulongunsignedlongint/long
c_longlong__int64 or longlongint/long
c_ulonglongunsigned__int64 or unsignedlonglongint/long
c_floatfloatfloat
c_doubledoublefloat
c_longdoublelongdoublefloat
c_char_pchar* (NUL terminated)string or None
c_wchar_pwchar_t* (NUL terminated)unicode or None
c_void_pvoid*int/long or None


   首先导入ctypes:


from ctypes import *

   定义最大子节点个数,也即静态数组的大小。    

#max child node number
MAX_NODE_CHILD_NUM = 46

   下面就是重点了,需要用python模拟出Linux C的结构体来。


#define tree node
class whitelist_tree_node(Structure):
    pass
whitelist_tree_node._fields_ = [
    ("white_type", c_ubyte),
    ("child_count", c_ubyte),
    ("child_order", c_ubyte * MAX_NODE_CHILD_NUM),
    ("childs", POINTER(whitelist_tree_node))
]
#define tree
class whitelist_tree(Structure):
    pass
whitelist_tree._fields_ = [
    ("root", POINTER(whitelist_tree_node)),
    ("whitelist_count", c_uint)
]
#define query url whitelist control
PUrlWhiteListControl = POINTER(whitelist_tree)

   为了定义节点指向自己的指针,这里必须先用pass定义一个空的对象,否则会出现“NameError: name 'whitelist_tree_node' is not defined”的错误。取类型的指针用POINTER()函数,而取变量对象的指针用pointer()函数,注意区分。


   导入库,可用绝对路径:    

#load library
url_whitelist_lib = cdll.LoadLibrary("./liburlwhitelist.so")


   引入接口函数,并对接口函数属性进行设置。    

#define init function
InitUrlWhiteList = url_whitelist_lib.InitUrlWhiteList
#define argument types
InitUrlWhiteList.argtypes = [POINTER(PUrlWhiteListControl)]
#define return types. By default functions are assumed to return the C int type
InitUrlWhiteList.restype = c_int
                                                                                                                                                                                        
#define search function
SearchUrlWhiteList = url_whitelist_lib.SearchUrlWhiteList
SearchUrlWhiteList.argtypes = [c_char_p, PUrlWhiteListControl]
SearchUrlWhiteList.restype = c_int
                                                                                                                                                                                        
#define close function
CloseUrlWhiteList = url_whitelist_lib.CloseUrlWhiteList
CloseUrlWhiteList.argtypes = [PUrlWhiteListControl]
CloseUrlWhiteList.restype = None

   定义每个函数第一行“InitUrlWhiteList =url_whitelist_lib.InitUrlWhiteList”是为了减少函数调用。InitUrlWhiteList.argtypes设置函数的参数,为了更好的调用,减少出错。

InitUrlWhiteList.restype设置函数的返回类型,因为ctypes默认的返回类型时C int,我这里还是指出,便于统一和减少出错。


   使用部分例子:

p_control = PUrlWhiteListControl()
ret_code = InitUrlWhiteList(None, pointer(p_control))
if ret_code != 0:
    print "InitUrlWhiteList error code: %d" % ret_code
else:
    print "init url whitelist num: %u" % p_control.contents.whitelist_count

   这里有三个地方需要注意。一、None变量即是C中NULL。二:InitUrlWhiteList参数,因其第二个参数为PUrlWhiteListControl的指针,所以这里用pointer()函数,当然也可用byref()函数,但是在官方文档中指出:

The same effect can be achieved with the pointer() function, although
pointer() does a lot more work since it constructs a real pointer
object, so it is faster to use byref() if you don’t need the pointer
 object in Python itself

   所以这里我们还是用pointer()函数好。三、因PUrlWhiteListControl本身是一个指针,要访问他的内容需要用contents方法。如“p_control.contents.whitelist_count”。


   好了,关于ctypes,先介绍到这里,更详细的请参考官方文档:https://docs.python.org/2/library/ctypes.html。详细代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: sqt
# @Email:  qingtao_shang@vulnhunt.com
# @Date:   2014-04-30 09:57:37
# @Desc:   Python测试URL白名单动态库
# @Last Modified by:   sqt
# @Last Modified time: 2014-04-30 13:30:17
               
from ctypes import *
               
#max child node number
MAX_NODE_CHILD_NUM = 46
               
#define tree node
class whitelist_tree_node(Structure):
    pass
               
whitelist_tree_node._fields_ = [
    ("white_type", c_ubyte),
    ("child_count", c_ubyte),
    ("child_order", c_ubyte * MAX_NODE_CHILD_NUM),
    ("childs", POINTER(whitelist_tree_node))
]
               
#define tree
class whitelist_tree(Structure):
    pass
               
whitelist_tree._fields_ = [
    ("root", POINTER(whitelist_tree_node)),
    ("whitelist_count", c_uint)
]
               
#define query url whitelist control
PUrlWhiteListControl = POINTER(whitelist_tree)
#load library
url_whitelist_lib = cdll.LoadLibrary("./liburlwhitelist.so")
               
#simple call function name
#define init function
InitUrlWhiteList = url_whitelist_lib.InitUrlWhiteList
#define argument types
InitUrlWhiteList.argtypes = [POINTER(PUrlWhiteListControl)]
#define return types. By default functions are assumed to return the C int type
InitUrlWhiteList.restype = c_int
               
#define search function
SearchUrlWhiteList = url_whitelist_lib.SearchUrlWhiteList
SearchUrlWhiteList.argtypes = [c_char_p, PUrlWhiteListControl]
SearchUrlWhiteList.restype = c_int
               
#define close function
CloseUrlWhiteList = url_whitelist_lib.CloseUrlWhiteList
CloseUrlWhiteList.argtypes = [PUrlWhiteListControl]
CloseUrlWhiteList.restype = None
               
#sample
if __name__ == "__main__":
    p_control = PUrlWhiteListControl()
    ret_code = InitUrlWhiteList(None, pointer(p_control))
    if ret_code != 0:
        print "InitUrlWhiteList error code: %d" % ret_code
    else:
        print "init url whitelist num: %u" % p_control.contents.whitelist_count
                
    url = ""
    while 1:
        url = raw_input("Input url or exit:")
        if url == "q" or url == "exit":
            break
               
        find_code = SearchUrlWhiteList(url, p_control)
        if find_code == 0:
            print "url: %s find." % url
        else:
            print "url: %s not find." % url
                
    CloseUrlWhiteList(p_control)
    del p_control


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python调用Linux c库:cty

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python调用Linux c库:cty

我在http://jlnsqt.blog.51cto.com/2212965/1405052这篇博客中讲述了匹配URL的一个算法,因项目需要将其封装为动态库,并让python组调用,所以研究了一下ctypes,感觉超级棒,必须记录下来。  
2023-01-31

python调用C库

编写C库test.c#include #include int strcmpTest(char *a, char *b){ return strcmp(a, b);}void strcpy
2023-01-31

C++调用动态库和Python调用C++动态库的方法是什么

这篇文章主要介绍“C++调用动态库和Python调用C++动态库的方法是什么”,在日常操作中,相信很多人在C++调用动态库和Python调用C++动态库的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
2023-07-05
2023-10-07

Python与C之间的相互调用(Python C API及Python ctypes库)

问题,需要实现全局快捷键,但是是事实上Qt并没有对全局快捷键提供支持,那么用Qt的话就只能通过Win32Api来完成了,而我,用的是PyQt,还需要用Python来调用win32 API,事实上,都没有什么难的。因为Python如此的流行,
2023-06-05

python如何直接调用和使用swig法方调用c++库

小编给大家分享一下python如何直接调用和使用swig法方调用c++库,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!c++运算速度快于python,python简单易写。很多时候对于已有的c++代码也不想用python重
2023-06-29

linux中使用boost.python调用c++动态库的方法

前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面。测试办法是让 robot framework 通过 SSHLIb
2022-06-04

python调用调用Linux命令

如何调用Linux命令下面代码演示了调用一个shell命令, 其中,命令的输出会存储到result变量中, 而命令的返回值,则存储到exitcode中,由此可见,调用shell命令还是很方便的:import commandsexitcode
2023-01-31

C#中怎么使用IronPython库调用Python脚本

在C#中使用IronPython库调用Python脚本的步骤如下:首先,需要将IronPython库添加到C#项目中。可以通过NuGet包管理器搜索IronPython,并将其添加到项目中。创建一个Python脚本文件,编写需要调用的Pyt
C#中怎么使用IronPython库调用Python脚本
2024-03-08

c++ pthread库怎么调用

要使用pthread库,需要引入头文件`#include `。下面是一个简单的示例,展示了如何使用pthread库创建和运行一个线程。#include #include // 线程函数,用于并行执行的任务void* threadFu
2023-10-26

rust怎么调用c++库

在Rust中调用C++库,可以使用Rust的FFI(Foreign Function Interface)功能来实现。以下是一般的步骤:创建一个Rust项目,可以使用`cargo new`命令来创建一个新的项目。在项目目录下创建一个C++库
2023-10-26

golang怎么调用c++库

要在Golang中调用C++库,你需要使用CGo,它是Golang与C/C++代码交互的一种方式。下面是一个简单的示例,展示了如何调用一个C++库:首先,创建一个名为example.cpp的C++源文件,其中包含需要调用的函数:cpp#in
2023-10-20

C#怎么调用js库

这篇文章主要介绍“C#怎么调用js库”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#怎么调用js库”文章能帮助大家解决问题。安装ClearScriptClearScript是微软开源的js引擎,支
2023-07-05

C++如何调用python

小编给大家分享一下C++如何调用python,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、首先要配好vs开发工程注意版本;我这使用32位的python那么我v
2023-06-22

编程热搜

目录