diff options
author | Daniel M. Pelt <D.M.Pelt@cwi.nl> | 2015-07-17 16:22:05 +0200 |
---|---|---|
committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2015-07-23 11:57:17 +0200 |
commit | 3d136b7c819b0b142ad056bf01c8c1191eea9ba0 (patch) | |
tree | c94bdf6cb861c3e2570e7e2437a30c58513e3780 /src/PluginAlgorithm.cpp | |
parent | 2f871bc7068d6c87a7d950ae044ba66b0b8dcd3f (diff) | |
download | astra-3d136b7c819b0b142ad056bf01c8c1191eea9ba0.tar.gz astra-3d136b7c819b0b142ad056bf01c8c1191eea9ba0.tar.bz2 astra-3d136b7c819b0b142ad056bf01c8c1191eea9ba0.tar.xz astra-3d136b7c819b0b142ad056bf01c8c1191eea9ba0.zip |
Fix numpy lapack loading when running in Matlab
Diffstat (limited to 'src/PluginAlgorithm.cpp')
-rw-r--r-- | src/PluginAlgorithm.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/PluginAlgorithm.cpp b/src/PluginAlgorithm.cpp index 8ba6631..c26ee3f 100644 --- a/src/PluginAlgorithm.cpp +++ b/src/PluginAlgorithm.cpp @@ -67,8 +67,37 @@ void CPluginAlgorithm::run(int _iNrIterations){ Py_DECREF(retVal); } +void fixLapackLoading(){ + // When running in Matlab, we need to force numpy + // to use its internal lapack library instead of + // Matlab's MKL library to avoid errors. To do this, + // we set Python's dlopen flags to RTLD_NOW|RTLD_DEEPBIND + // and import 'numpy.linalg.lapack_lite' here. We reset + // Python's dlopen flags afterwards. + PyObject *sys = PyImport_ImportModule("sys"); + if(sys!=NULL){ + PyObject *curFlags = PyObject_CallMethod(sys,"getdlopenflags",NULL); + if(curFlags!=NULL){ + PyObject *retVal = PyObject_CallMethod(sys, "setdlopenflags", "i",10); + if(retVal!=NULL){ + PyObject *lapack = PyImport_ImportModule("numpy.linalg.lapack_lite"); + if(lapack!=NULL){ + Py_DECREF(lapack); + } + PyObject_CallMethod(sys, "setdlopenflags", "O",curFlags); + Py_DECREF(retVal); + } + Py_DECREF(curFlags); + } + Py_DECREF(sys); + } +} + CPluginAlgorithmFactory::CPluginAlgorithmFactory(){ Py_Initialize(); +#ifndef _MSC_VER + if(astra::running_in_matlab) fixLapackLoading(); +#endif pluginDict = PyDict_New(); inspect = PyImport_ImportModule("inspect"); six = PyImport_ImportModule("six"); |