编写 python 模块

2018-01-13 10:57:26来源:网络收集作者:程序诗人人点击

分享

阿里云爆款
编写 python 模块

今天手下小朋友再问如何找到python模块C的代码,他觉得SSL的接口不合乎他要的。后来事情有些曲折,原叫他先使用pyOpenSSL。最后还是要研究一下python模块。
如下解析和编写会使用pyOpenSSL说明。


解析pyOpenSSL

pyOpenSSL 代码里src/OpenSSL/_util.py 如下引用cryptography模块,用于把SSL代码引入pyOpenSSL调用。当然这还是python代码,不合乎我们要的。


from cryptography.hazmat.bindings.openssl.binding import Binding
lib = binding.lib
解析cryptography

cryptography代码里 src/cryptography/hazmat/bindings/openssl/binding.py使用__import__引用ssl模块,其作用在于引用SSL的C模块。


__import__("_ssl")
解析SSL模块

我们知道C模块代码,那如何引用的,请先下载Python代码,我指Python Compiler Source code。
查看Modules/Setup.dist,我们找到如下编译选项。清楚知道这代码链接OpenSSL加密库和SSL库。所以如果熟悉OpenSSL应用如何写,看_ssl.c可以找到OpenSSL的调用实作,在此不解释。


# Socket module helper for socket(2)
_socket socketmodule.c timemodule.c
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c /
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl /
-L$(SSL)/lib -lssl -lcrypto
编写Python模块

进入主题,如何写模块·,可以分成两部分。


编写Python代码模块
编写C代码模块
python代码

查看 Python 模块文档提到如下写法,假设我们模块架构如下。


sound/ Top-level package
__init__.py Initialize the sound package
formats/Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...

每个模块内都要有个__init__.py,用于初始化模块,但可以为空档案。如果我们想调用echo.py接口,如下import即可。


import sound.effects.echo

但使用就很不简洁,因为要这样才可以呼叫接口。


sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

更好写法如下,看起来好多了。


from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)

或是更简洁


from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)

如果想省事,想全部import


from sound.effects import *
C 代码·

编写C模块代码,范本如下


static PyObject *MyFunction( PyObject *self, PyObject *args );
static PyObject *MyFunctionWithKeywords(PyObject *self,
PyObject *args,
PyObject *kw);
static PyObject *MyFunctionWithNoArgs( PyObject *self );

不多说,直接给个简易代码,如下会生成一个名为helloworld的模块


#include
static PyObject* helloworld(PyObject* self) {
return Py_BuildValue("s", "Hello, Python extensions!!");
}
static char helloworld_docs[] =
"helloworld( ): Any message you want to put here!!/n";
static PyMethodDef helloworld_funcs[] = {
{"helloworld", (PyCFunction)helloworld,
METH_NOARGS, helloworld_docs},
{NULL}
};
void inithelloworld(void) {
Py_InitModule3("helloworld", helloworld_funcs,
"Extension module example!");
}

如何编译,需要使用如下编译脚本。就存为setup.py


from distutils.core import setup, Extension
setup(name='helloworld', version='1.0',/
ext_modules=[Extension('helloworld', ['hello.c'])])

如下编译或安装


$ python setup.py build
$ python setup.py install

如何使用刚写好的模块,介绍完毕。更多内容可以看如下Reference。


#!/usr/bin/python
import helloworld
print helloworld.helloworld()

Reference
[1] cryptography GitHub
[2] cryptography GitHub
[3] Python如何链接OpenSSL
[4] Python代码
[5] 如何编写Python模块
[6] 如何编写C模块


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台