環(huán)境
ubuntu16.04
python3.5.1+
cffi 1.7.0
gcc 5.4.0
例子(API level, out-of-line)
# file "example_build.py"
# Note:我們和章節(jié)1中的例子一樣實(shí)例化了'cffi.FFI',
# 但是這次實(shí)例名字為'ffibuilder'妻味,而不是'ffi';
# 這樣可以避免混淆张咳。
import FFI
ffibuilder = FFI()
ffibuilder.set_source("_example",
""" // 傳遞給C編譯器
#include <sys/types.h>
#include <pwd.h>
""",
libraries=[])
ffibuilder.cdef(
""" // man page或者頭文件里面復(fù)制的定義
struct passwd { char *pw_name; ...; // 三個(gè)點(diǎn) };
struct passwd *getpwuid(int uid);
""")
if __name__ == "__main__":
ffibuilder.compile(verbose=True)
運(yùn)行一次example_build.py
$python example_build.py
generating ./_example.c
running build_ext
building '_example' extension
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.5m -I/home/wang/venv/include/python3.5m -c _example.c -o ./_example.o
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 ./_example.o -o ./_example.cpython-35m-x86_64-linux-gnu.so
# 生成三個(gè)文件:_example.c,
# _example.o,
# _example.cpython-35m-x86_64_linux-gnu.so
CFFI根據(jù)set_source()
第二個(gè)參數(shù)是不是None
來(lái)選擇生成Python module(.pyd)還是C module(.so)。
然后在主程序,這樣寫:
# file "example.py"
from _example import ffi, lib
p = lib.getpwuid(0)
print(ffi.string(p.pw_name))
主程序運(yùn)行結(jié)果:
# 輸出
$python example.py
b'root'
大家會(huì)發(fā)現(xiàn),在
pwd.h
中定義的struct passwd
是這樣的:
struct passwd
{
char * pw_name; /* Username, POSIX.1 /
char * pw_passwd; / Password /
__uid_t pw_uid; / User ID, POSIX.1 /
__gid_t pw_gid; / Group ID, POSIX.1 /
char * pw_gecos; / Real Name or Comment field /
char * pw_dir; / Home directory, POSIX.1 /
char * pw_shell; / Shell Program, POSIX.1 */
char *pw_class;
time_t pw_change;
time_t pw_expire;
};
>而我們定義的是
>```python
ffibuilder.cdef(
""" // man page或者頭文件里面復(fù)制的定義
struct passwd { char *pw_name; ...; // 三個(gè)點(diǎn) };
struct passwd *getpwuid(int uid);
""")
未完待續(xù)。嫡秕。。