python 调用 c 函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
python 调用 c 函数
最近对lua加密,用到了xxtea_encrypt,打算用python写个工具,直接python调用c.



// xxtea_Encrypt.cpp : 定义控制台应用程序的入口点。
//
#include "xxtea.h"
#include "Python.h"

PyObject* xxtea_encrypt(PyObject* self, PyObject* args)
{
	unsigned char *data = NULL;
	unsigned char *key = NULL;
	unsigned int dataLen = 0;
	unsigned int keyLen = 0;
	unsigned int retLen = 0;

	if (! PyArg_ParseTuple(args, "s#s#", &data,&dataLen,&key,&keyLen))
		return NULL;
	unsigned char * encrypt = xxtea_encrypt(data,dataLen,key,keyLen,&retLen);	
	return Py_BuildValue("s#",encrypt,retLen);
}

PyObject* xxtea_decrypt(PyObject* self, PyObject* args)
{
	unsigned char *data = NULL;
	unsigned char *key = NULL;
	unsigned int dataLen = 0;
	unsigned int keyLen = 0;
	unsigned int retLen = 0;

	if (! PyArg_ParseTuple(args, "s#s#", &data,&dataLen,&key,&keyLen))
		return NULL;
	unsigned char * decrypt = xxtea_decrypt(data,dataLen,key,keyLen,&retLen);	
	return Py_BuildValue("s#",decrypt,retLen);
}


static PyMethodDef xxteaMethods[] =
{
	{"encrypt", xxtea_encrypt, METH_VARARGS, "xxteaEncrypt"},
	{"decrypt", xxtea_decrypt, METH_VARARGS, "xxteaDecrypt"},
	{NULL, NULL}
};

void initxxteaModule()
{
	PyObject* m;
	m = Py_InitModule("xxteaModule", xxteaMethods);
}



initxxteaModule python封装头,函数名为init+module名(Py_InitModule的第一个参数)。python导包时,会用到 import xxteaModule.
Py_InitModule第二个参数,c函数的相关描述信息。
struct PyMethodDef {
    const char  *ml_name;   /* The name of the built-in function/method */
    PyCFunction ml_meth;    /* The C function that implements it */
    int         ml_flags;   /* Combination of METH_xxx flags, which mostly
                               describe the args expected by the C func */
    const char  *ml_doc;    /* The __doc__ attribute, or NULL */
};


然后就是对c函数的封装,主要是c到python变量的一些转换.


最后说一下编译,这个网上很多都没有说清楚。写一个setup.py.

from distutils.core import setup, Extension
MOD = 'xxteaModule'

setup (name = MOD,ext_modules = [Extension(name=MOD, sources = ['xxtea_Encrypt.cpp','xxtea.cpp'])])

cmd 下执行命令:python setup.py build
将生成的build\lib.win32-2.7\xxteaModule.pyd拷贝到python DLLs目录中。
来看调用的例子。

import xxteaModule
def EncodeWithXxteaModule(filePath,key,signment):    
    all_the_text = ReadFile(filePath)    

    if all_the_text[:len(signment)] == signment :
        return
    #bak lua
    BakFile(filePath,all_the_text)
       
    encrypt = xxteaModule.encrypt(all_the_text,key)
    signment = signment + encrypt
    WriteFile(filePath,signment)    


要注意的是,编译pyd时,机器必须安装vs2008,如果要使用其它编译器,改Python27\Lib\distutils\msvc9compiler.py 。关键代码:vc_env = query_vcvarsall(VERSION, plat_spec)


python调用C函数时的数组传递 python调用C函数时的数组互传 2019-4-5 引言:最近需要对一个算法进行并行加速,最初使用python实现的,也尝试了用python中的多线程进行加速,后来才发现,python中的threading受制于GIL,同时只能使用一个核进行运算,所以搞了半天最后发现多线程和非并行算法在运行时间上无差别。当然我也尝试了multiprocessing模块,但我那个算法不适合用多进程的方法加速,... 阅读详情

相关推荐

C语言调用Python函数

1、Python脚本源码 from googletrans import Translator translator = Translator(service_urls=[ 'translate.google.cn', ]) def trans(str): print(translator.translate(str, dest='zh-CN').text) ...

天牛虫 2227

Cocos2d-x读取本地文件

在公司在项目开发的时候需要读取本地的文件,于是在网上搜索了一下以下关于Cocos2d-x文件读取的操作,用了两种方法都可以实现,一种是使用C++另种是Cocos2d-x代码如下: //读取文件(参数分别为文件名和文本框) void GameRegistry::readFile(const char *pFileName,UILabel *pLabel) { /*方法一 ifstrea

啊婷和阿基 2690

Python的XXTEA加密算法库.zip

Python的XXTEA加密算法库

python调用C语言

python由于在实现多线程的情况下,由于GIL(全局解释器锁)的存在,只能实现伪线程,要想真正实现多线程,可以调用第三方的扩展,使用C语言编写一些需要实现多线程的业务逻辑。 最常用的调用C函数的方式,分别是c extension,Cython和ctypes。 c extension 介绍 python标准库包含了很多使用C开发的扩展模块,比如对性能要求很高的json库。开发者同样可以使用...

weixin_34409703的博客 870

python 调用c语言方法详解

但是需要注意的是,在 pycharm中调用其他程序时,需要对该函数的参数进行设置,例如: 在以上代码中,我们要将文件名存储在`my_name`变量中,并且将其设置为` example`。在这个函数中,我们将使用C++来调用 Python的程序,并使用 Python来处理C++中的变量和其他函数。例如: 4.在调用 lambda函数时,我们需要设置参数列表中所定义变量的名称,例如: 5.将 lambda函数作为参数传递给 lambda函数并返回参数列表中所定义变量的值,即用它来实现相应的功能。

花生日记 9892

Python的C语言接口 - 详解官方文档

Python官方对于C语言接口的文档、中文翻译以及疑难详解。

weixin_50930712的博客 4065

python】在python调用C函数

python中使用ctype库调用C函数

weixin_45603650的博客 991

python调用C函数的三种方式

一个python项目快速开发完以后,常常针对瓶颈进行优化,其中一种方式就是对于性能至关重要的部分,使用C重写,这已经是一种最佳实践。如果整个项目完全使用C,开发效率就没有保障。python运行环境(CPython)是用C开发的,因此python与C结合起来很容易,而且方式多种多样。使用C重写了关键部分后,需要在python调用,本文介绍三种最常用的调用C函数的方式,分别是c extension,Cython和ctypes。 举个例子,假设我们用C重写了add函数,它接受两个整数,计算他们的和并返回。

天涯路的专栏 9847

python调用c函数_如何在Python调用C函数

您是否遇到过必须使用python调用C函数的情况?本文将在非常基础的层面为您提供帮助,如果您没有遇到过这种情况,您会很高兴知道它是如何实现的。首先,让我们用C编写一个简单的函数,并生成该文件的共享库。假设文件名是function.c。int myFunction(int num){if (num == 0)//如果number为0,则不执行任何操作。return 0;else// 如果number...

weixin_39955423的博客 255

python怎么调用c函数_在Python调用C函数

小编典典如果我理解得很好,您将没有偏好​​使用c => python或类似python =>c进行对话。在那种情况下,我会推荐Cython。它对多种操作都非常开放,特别是在您的情况下,调用从C用Python编写的函数。这是它的工作方式(publicapi):以下示例假定您有一个Python类(self是它的一个实例),并且该类具有method要在该类上调用并处理C的结果(在此为adou...

weixin_36280492的博客 950

C语言调用python函数

通过C语言调用Python代码,需要先安装libpython3的 dev依赖库(不同的ubuntu版本下,python版本可能会有差异, 比如ubuntu 22.04里是libpython3.10-dev)。

qq_61391875的博客 2003

python调用c语言函数_从Python调用C函数

python调用c语言函数We can call a C function from Python program using the ctypes module. 我们可以使用ctypes模块从Python程序调用C函数。 从Python调用C函数 (Calling C Function from Python) It involves the following steps: 它涉及以下步...

从零开始的教程世界 1266

如何在Python调用C语言函数

Python是胶水语言,能使用非常多的模块去实现很多跨语言跨平台的功能。下面就讲一下怎么在python调用c语言函数。首先,Python无法直接解析C文件,所以就需要将c文件编译成动态库。 流程: 编写C语言文件 ,编译成动态库。 在python中加载这些动态库 调用函数函数可以有返回值,使用ctype模块做转换。 编译库 通过python调用c函数,返回"hello,world" 字符串。新建c语言文件 hello.c: 1 #include <stdio.h> 2 3 char

甲客实验室 2520

Python调用C语言函数

Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。 示例如下 实现两数求和的C代码,保存为add.c //sample C file to add 2 numbers - int and floats #include &l...

天岸马的专栏 1586

python怎么调用c函数_从Python调用C函数

我使用了一个用Python编写的服务器文件来建立我的Raspberry Pi和iPhone之间的连接。我写了一个简单的C程序来帮助翻译莫尔斯电码。我想从Python服务器程序调用C程序中的translate()函数。在我在网上找到了一个教程,按照它的说明编写了我的C程序并编辑了netio_server.py文件在我的C程序中morseCodeTrans.c它就像#include #include ...

weixin_26642481的博客 161

PYTHON调用C语言函数

使用Python的ctypes,我们可以直接调用由C直接编译出来的函数。其实就是调用动态链接库中的函数。为什么我们需要这样做呢,因为有些时候,我们可能需要一个性能上比较讲究的算法,有些时候,我们可以在Python中使用已经有了的现成的被封闭在动态链接库中的函数。下面是如何调用的示例。首先,我们用一个乘法来表示一个算法功能。下面是C的程序:12345intmultiply(int num1, int...

weixin_36841920的博客 408

python怎么调用c函数_python 调用c语言函数的方法

虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成。这样,就需要用python调用c的代码了具体流程:c编写相关函数 ,编译成库然后在python中加载这些库,指定调用函数。这些函数可以char ,int, float, 还能返回指针。以下示例:通过python调用c函数,返回"hello,world 字符串"新建c语言文件 hello.ctouch hello.c#includ...

weixin_35726635的博客 1030

Python调用C函数

软硬件环境 ubuntu 18.04 64bit windows 10 64bit Python 3.5.1 GCC 4.9 visual studio 前言 最近在做python3开发中,碰到了一个问题,需要通过调用C的一个动态链接库来获取相应的值。扒了扒网络,动手实践了下,形成此文。 linux版的动态库 写个简单的C代码,test.c #include &lt;stdio.h&gt; #...

666

Python调用c/c++函数

Python调用c/c++函数Python的编码速度无疑要高于C++,但有些时候,我们不得不使用C++的某些库,这个时候,可以使用Python调用c/c++的功能来实现. C/C++部分: 首先定义一个类 class Foo{ public: double x = 0; public: double bar(double t){ x = t; ...

浮生 709
上一篇: cocos2dx lua 加密
下一篇: Lua 点号与冒号
缥缈的云
博客等级 码龄15年 94粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值