This package is used to load a shared library in Python. It is basically just a thin wrapper
around ctypes (for libraries that use the __cdecl
or __stdcall
calling convention),
Python for .NET (for libraries that use Microsoft's .NET Framework, CLR
), Py4J
(for Java .jar
or .class
files) and comtypes (for libraries that use the
Component Object Model).
However, the primary advantage is that it is possible to communicate with a 32-bit shared library from 64-bit Python.
Tested in Python 2.7, 3.4+. The examples provided are currently only supported in Windows and Linux.
MSL-LoadLib is a pure-python package, but, Python for .NET depends on the .NET Common Language Runtime (CLR) on Windows and Mono Runtime on Linux and OSX and Py4J depends on having a Java Virtual Machine installed.
To install MSL-LoadLib run:
pip install msl-loadlib
Alternatively, using the MSL Package Manager run:
msl install loadlib
Optional dependencies:
To set up your environment on Linux, please follow the instructions on the prerequisites section of the documentation.
If you are loading a 64-bit library in 64-bit Python, or a 32-bit library in 32-bit Python,
then you can directly load the library using LoadLibrary
.
The following examples load a 64-bit library in a 64-bit Python interpreter. If you are using a 32-bit Python interpreter then replace the 64 with 32 in the filename.
Import the LoadLibrary
class and the directory where the example libraries are located
>>> from msl.loadlib import LoadLibrary
>>> from msl.examples.loadlib import EXAMPLES_DIR
If the file extension is not included then a default extension, .dll
(Windows) or .so
(Linux), is used.
Load a C++ library
and call the add
function
>>> cpp = LoadLibrary(EXAMPLES_DIR + '/cpp_lib64')
>>> cpp.lib.add(1, 2)
3
Load a FORTRAN
library and call the factorial
function
>>> fortran = LoadLibrary(EXAMPLES_DIR + '/fortran_lib64')
With a FORTRAN library you must pass values by reference using ctypes, and, since the returned value is not
of type int
we must configure ctypes for a value of type double
to be returned
>>> from ctypes import byref, c_int, c_double
>>> fortran.lib.factorial.restype = c_double
>>> fortran.lib.factorial(byref(c_int(37)))
1.3763753091226343e+43
Load a .NET library
and call the reverse_string
function, we must specify that the library type is a .NET library by passing
in the 'net'
argument
>>> net = LoadLibrary(EXAMPLES_DIR + '/dotnet_lib64.dll', 'net')
>>> net.lib.StringManipulation.reverse_string('abcdefghijklmnopqrstuvwxyz')
'zyxwvutsrqponmlkjihgfedcba'
Load Java byte code
and call the cos
function
>>> java = LoadLibrary(EXAMPLES_DIR + '/Trig.class')
>>> java.lib.Trig.cos(1.234)
0.33046510807172985
Python interacts with the Java Virtual Machine via a local network socket and therefore the connection needs to be closed when you are done using the Java library
>>> java.gateway.shutdown()
To load a Component Object Model (COM) library pass in the library's Program ID. NOTE: This example will only work on Windows.
Here we load the FileSystemObject library and include the 'com'
argument to indicate that
it is a COM library. We then use the library to create, edit and close a text file
>>> 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 is used to access a 32-bit shared library from a module that is
running within a 64-bit Python interpreter. The procedure uses a client-server protocol where the client
is a subclass of msl.loadlib.Client64
and the server is a subclass of msl.loadlib.Server32
.
See the tutorials for
examples on how to implement inter-process communication.
The documentation for MSL-LoadLib can be found here.