加载共享库(并从64位python访问32位库)

msl-loadlib的Python项目详细描述


Documentation Statuspypi

此包用于在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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我想访问同一类的不同函数中的函数变量   创建字段/值哈希映射的java反射   java Velocity工具向后兼容性?   cmd JAVA运行时错误:发生JNI错误   java spring引导示例hateoas不工作   java为什么Android Studio和gradle可以使用不同的类路径进行单元测试?   java Selenium Firefox驱动程序初始化   java如何在jar中重新定位gradle依赖项的包   java为什么我的单线程hello world应用程序使用22个OS线程?   正则表达式替换Java字符串中的特殊字符   在任何派生类的构造函数之后运行方法的java   java从输入字符串中找出日期   带有libGdx(Java)音乐的安卓studio可以在Android模拟器上工作,但不能在桌面上工作   java我在getconnection的参数方面有错误吗?   java使用JFileChooser访问选定文件   java如何将Json解析为另一个活动   java使用Resources for html和rest server   java更新列表,列表内容来自循环中的方法   java如何在GLSL中读取完整范围的32位整数纹理