lharri73 / PySimlink

Compile, run, and interact with Simulink models natively in Python. https://lharri73.github.io/PySimlink/
GNU General Public License v3.0
15 stars 4 forks source link

Failed to load compiled model #18

Open Thandre opened 3 months ago

Thandre commented 3 months ago

I try to load a test model into pysimlink. I do a simple:

model = Model("testmodel", "./testmodel.zip", generator='MinGW Makefiles')

After compile step I get an error loading the generated module:

(_venv) D:\Python\pySimlink>python main.py Compiling ... done Traceback (most recent call last): File "D:\Python\pySimlink\main.py", line 14, in model = Model("testmodel", "./testmodel.zip", generator='MinGW Makefiles') File "D:\Python\pySimlink_venv\lib\site-packages\pysimlink\lib\model.py", line 92, in init self.module = importlib.import_module(self._model_paths.module_name) File "C:\Program Files\Python39\lib\importlib__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "", line 1030, in _gcd_import File "", line 1007, in _find_and_load File "", line 986, in _find_and_load_unlocked File "", line 666, in _load_unlocked File "", line 565, in module_from_spec File "", line 1173, in create_module File "", line 228, in _call_with_frames_removed ImportError: DLL load failed while importing testmodel_interface_c: Das angegebene Modul wurde nicht gefunden.<

I set up a virtual environment in Python 3.9.9 with just the requirements needed for pysimlink. I also had to comment out the two lines for locking / unlocking as described in #17 .

The file "D:\Python\pySimlink\__pycache__\pysimlink\testmodel\build\out\library\testmodel_interface_c.cp39-win_amd64.pyd" is generated and is located in the given folder.

Thandre commented 3 months ago

When I try the steps with Python 3.6 everything works fine. It seems to be a Windows specific issue that was introduced in Python 3.8 (Link).

lharri73 commented 3 months ago

Does adding os.add_dll_directory(dir) to the for loop at model.py fix the issue? If so, I can push a fix.

from https://stackoverflow.com/a/67437837

Thandre commented 2 months ago

This was also my first thought. Unfortunately this doesn't solve the issue. Maybe the path has to be adjusted as well. According to this comment the backslashes have to be replaced with slashes and double slash after the colon. I'll try this and give an update.

Thandre commented 2 months ago

It seems to be also an issue with MinGW compiler. The "bin" folder of the MinGW installation has to be added with os.add_dll_directory() as well. I found the information here and here. The original problem is that MinGW has its own libstdc++-6.dll which is dynamically linked to the compiled Simulink model. This makes it necessary to add the MinGW bin folder to the "dll search path". As an alternative the Simulink model has to be linked with static libs but I don't know how to do that.