如何⽤c语⾔写python库_使⽤C语⾔来写⼀个Python扩展库⼀些加密解密功能⽐较重要,底层的实现不应该被外界的⼈所感知。
跟随我的步伐,花费10分钟的阅读时间,三步之内解决使⽤C语⾔来写扩展库的问题(python 2.7)。
⽬录⽂件
├── crypt.h // 头⽂件
├── libcrypt.a // 包含Encrypt和Decrypt的具体实现
├── occrypt.c // 暴露给Python使⽤的主要⽂件
├── occrypt.so* // ⽣成的Python扩展库
└── test.py // 测试程序
C语⾔写Python扩展库⽰例
occrypt.c⽂件内容
#include "crypt.h"
#include
#include
#include
#include
static PyObject * /* returns string object */
oc_encrypt(PyObject *self, PyObject *args)
{
char *key = NULL;
char *plainText = NULL;
if (!PyArg_ParseTuple(args, "ss", &key, &plainText)) /* convert Python -> C */
编程先学c语言还是pythonreturn NULL; /* null=raise exception */
char *text = Encrypt(key, plainText);
PyObject *ret = Py_BuildValue("s", text); /* convert C -> Python */
free(text);
return ret;
}
static PyObject * /* returns string object */
oc_decrypt(PyObject *self, PyObject *args)
{
char *key = NULL;
char *plainText = NULL;
if (!PyArg_ParseTuple(args, "ss", &key, &plainText)) /* convert Python -> C */
return NULL; /* null=raise exception */
char *text = Decrypt(key, plainText);
PyObject *ret = Py_BuildValue("s", text); /* convert C -> Python */
free(text);
return ret;
}
/* registration table */
static PyMethodDef crypt_methods[] = {
{"encrypt", oc_encrypt, METH_VARARGS, "encrypt text"}, /* method name, C func ptr, always-tuple */ {"decrypt", oc_decrypt, METH_VARARGS, "decrypt text"}, /* method name, C func ptr, always-tuple */ {NULL, NULL, 0, NULL} /* end of table marker */
};
/* module initializer */
PyMODINIT_FUNC initoccrypt() /* called on first import */
{ /* name matters if loaded dynamically */
(void)Py_InitModule("occrypt", crypt_methods); /* mod name, table ptr */
}
相关解释与说明
initoccrypt函数的命名规则是init
相应的动态库的名字occrypt.so命名规则也是.so
oc_encrypt和oc_decrypt是对Encrypt和Decrypt的进⼀步封装,使它可以被Python代码调⽤
使⽤PyArg_ParseTuple来解析传⼊的Python参数
使⽤Py_BuildValue("s", text)来返回⼀个字符串
编译C语⾔扩展库⽰例
编译⽅法:
clang occrypt.c libcrypt.a \
-I/usr/local/anaconda3/envs/py27/include/python2.7 \
-L/usr/local/anaconda3/envs/py27/lib/ -lpython2.7 \
-shared -fPIC -o occrypt.so
相关解释与说明
-I/usr/local/anaconda3/envs/py27/include/python2.7表⽰Include路径,这个路径包含了⼀个Python.h -L/usr/local/anaconda3/envs/py27/lib/表⽰ld链接路径,这个路径包含了⼀个libpython2.7.dylib
请根据⾃⼰的环境做相应的调节
提⽰:clang是macos的编译⼯具,linux请切换⾄gcc
Python使⽤C扩展库⽰例
test.py⽂件内容
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import occrypt
text = pt("secret-key", "hello go go go!")
print("加密⽂本:%s" % text)
print("解密⽂本: %s" % occrypt.decrypt("secret-key", text))
进⼊含有occrypt.so的⽬录,调⽤python test.py的输出结果:
加密⽂本:5iDfvYIH9l7oTXaGrpbqCH1z24zJHjBaK9wTMQHlxA==解密⽂本: hello go go go!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论