更新:在Python 2.6+中,使用ctypes.get_errno()
。
Python 2.5
下面的代码不可靠(或者不够全面,因为errno
可能有很多定义方式),但应该可以让你开始(或者重新考虑一下是否需要一个微小的扩展模块(毕竟在Debian上,python setup.py install
或easy_install
应该没有问题构建它))。
来自http://codespeak.net/pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py。
if not hasattr(ctypes, get_errno ):
# Python 2.5 or older
if sys.platform == win32 :
standard_c_lib._errno.restype = ctypes.POINTER(ctypes.c_int)
def _where_is_errno():
return standard_c_lib._errno()
elif sys.platform in ( linux2 , freebsd6 ):
standard_c_lib.__errno_location.restype = ctypes.POINTER(ctypes.c_int)
def _where_is_errno():
return standard_c_lib.__errno_location()
elif sys.platform in ( darwin , freebsd7 ):
standard_c_lib.__error.restype = ctypes.POINTER(ctypes.c_int)
def _where_is_errno():
return standard_c_lib.__error()
ctypes.get_errno = lambda: _where_is_errno().contents.value
standard_c_lib
的意思是什么?
def get_libc_name():
if sys.platform == win32 :
# Parses sys.version and deduces the version of the compiler
import distutils.msvccompiler
version = distutils.msvccompiler.get_build_version()
if version is None:
# This logic works with official builds of Python.
if sys.version_info < (2, 4):
clibname = msvcrt
else:
clibname = msvcr71
else:
if version <= 6:
clibname = msvcrt
else:
clibname = msvcr%d % (version * 10)
# If python was built with in debug mode
import imp
if imp.get_suffixes()[0][0] == _d.pyd :
clibname += d
return clibname+ .dll
else:
return ctypes.util.find_library( c )
# Make sure the name is determined during import, not at runtime
libc_name = get_libc_name()
standard_c_lib = ctypes.cdll.LoadLibrary(get_libc_name())