A tiny intro to Python ctypes
If you've ever been interested in interfacing with shared libraries and DLL using Python, then there are basically three ways you can achieve it. One is to use Python/C API, second is to use SWIG and the third which I will demonstrate is to use ctypes. ctypes is a great companion to keep around as it allows one to call functions and extract data as C types from a shared library without leaving the pleasant world of Python. Without further ado, let me roll some code.
//ctypedemo.c
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
char* getenv2(char * environment)
{
fprintf(stdout,"getenv2(%s)\n",environme
fflush(0);
return getenv(environment);
}
int _init()
{
printf("%s\n","Loaded ctype shared library");
return 0;
}
#ctypedemo.py
from ctypes import *
from ctypes.util import find_library
import sys
ctype_sl = cdll.LoadLibrary('./libctypedemo.so.1') # load library
getenv_ = ctype_sl.getenv2(sys.argv[1]) # get 1st arg
ret = c_char_p(getenv_) # cast to char*
if ret:
print "\{0}={1}".format(sys.argv[1],ret.value)
#sharedlibcompile.sh
gcc -Wall -fPIC -c ctypedemo.c
gcc -shared -nostartfiles -Wl,-soname,libctypedemo.so.1 -o libctypedemo.so.1 -lc ctypedemo.o
export LD_PRELOAD=./libctypedemo.so.1
$ls
ctypedemo.c
ctypedemo.py
sharedlibcompile.sh
$./sharedlibcompile.sh
$ python ctypedemo.py PATH
Loaded ctype shared library
getenv2(PATH)
value for PATH=/usr/local/bin:/usr/local/sbin/:/bi
Hope you enjoyed the tiny intro. Feedbacks are welcome (constructive or destructive otherwise).
awake
sleepy
cheerful
pissed off
blah
dorky