加载共享库(并从64位python访问32位库)
msl-loadlib的Python项目详细描述
此包用于在python中加载共享库。基本上只是一个薄薄的包装 在ctypes(对于使用__cdecl或__stdcall调用约定的库)附近, Python for .NET(对于使用Microsoft.NET框架的库,CLR),Py4J (对于Java ^{TT4}$或^{TT5}$文件)和comtypes(对于使用 Component Object Model)。
但是,其主要优点是可以与32位共享 64位python的库。
在Python2.7、3.4+中测试。examples 提供的当前仅在Windows和Linux中受支持。
msl loadlib是一个纯python包,但是,Python for .NET依赖于.net公共语言 windows上的运行时(clr)和linux和osx上的mono运行时以及Py4J取决于 Java Virtual Machine已安装。
安装
安装msl loadlib运行:
pip install msl-loadlib
或者,使用MSL Package Manager运行:
msl install loadlib
可选依赖项:
要在Linux上设置环境,请按照 prerequisites 文档的一节。
示例
如果要在64位python中加载64位库,或在32位python中加载32位库, 然后可以使用LoadLibrary直接加载库。
以下示例在64位python解释器中加载64位库。如果你用的是32位 然后,python解释器将文件名中的64替换为32。
导入LoadLibrary类和示例库所在的目录
>>> frommsl.loadlibimportLoadLibrary>>> frommsl.examples.loadlibimportEXAMPLES_DIR
如果不包括文件扩展名,则使用默认扩展名.dll(windows)或.so(linux)。
加载C++库 并调用add函数
>>> cpp=LoadLibrary(EXAMPLES_DIR+'/cpp_lib64')>>> cpp.lib.add(1,2)3
加载FORTRAN 库并调用factorial函数
>>> fortran=LoadLibrary(EXAMPLES_DIR+'/fortran_lib64')
对于Fortran库,必须使用ctypes通过引用传递值,并且,由于返回的值不是 对于类型int,我们必须配置ctypes以返回类型double的值
>>> fromctypesimportbyref,c_int,c_double>>> fortran.lib.factorial.restype=c_double>>> fortran.lib.factorial(byref(c_int(37)))1.3763753091226343e+43
加载.NET库 并调用reverse_string函数,我们必须通过传递 在'net'参数中
>>> net=LoadLibrary(EXAMPLES_DIR+'/dotnet_lib64.dll','net')>>> net.lib.StringManipulation.reverse_string('abcdefghijklmnopqrstuvwxyz')'zyxwvutsrqponmlkjihgfedcba'
加载Java字节码 并调用cos函数
>>> java=LoadLibrary(EXAMPLES_DIR+'/Trig.class')>>> java.lib.Trig.cos(1.234)0.33046510807172985
python通过本地网络套接字与Java Virtual Machine交互,因此连接 使用完Java库后需要关闭
>>> java.gateway.shutdown()
加载库的程序id中的Component Object Model(com)库传递。 注意:此示例仅适用于Windows。
在这里,我们加载FileSystemObject库并包含'com'参数,以指示 它是一个COM库。然后,我们使用库创建、编辑和关闭文本文件
>>> com=LoadLibrary('Scripting.FileSystemObject','com')>>> fp=com.lib.CreateTextFile('a_new_file.txt')>>> fp.WriteLine('This is a test')0 >>> fp.Close()0
Inter-process communication用于从 在64位python解释器中运行。该过程使用客户机-服务器协议,其中客户机 是msl.loadlib.Client64的子类,服务器是msl.loadlib.Server32的子类。 参见tutorials了解 如何实现inter-process communication的示例。
文档
可以找到msl loadlib的文档here。