From b4415d5cf244d4d7fed2a028ccde294b6701612a Mon Sep 17 00:00:00 2001
From: Berk Onat <b.onat@warwick.ac.uk>
Date: Tue, 12 Dec 2017 17:42:56 +0000
Subject: [PATCH] Fixed numpy initialization bug at C functions.

---
 pymolfile/molfile/pymolfile.cxx | 21 ++++++++++++++++-----
 pymolfile/molfile/pymolfile.h   |  6 ++++++
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/pymolfile/molfile/pymolfile.cxx b/pymolfile/molfile/pymolfile.cxx
index d5ba6cb..e8d4c85 100644
--- a/pymolfile/molfile/pymolfile.cxx
+++ b/pymolfile/molfile/pymolfile.cxx
@@ -38,7 +38,12 @@ molfile_plugin_t** plugin_list;
 #define PyInt_AsLong PyLong_AsLong
 #define PyString_FromString PyBytes_FromString
 #define PyInt_FromLong PyLong_FromLong
-
+int initNumpyArray(void){
+    if(PyArray_API == NULL)
+    {
+        import_array();
+    }
+}
 void del_molfile_plugin_list(PyObject* molcapsule)
 {
     plugin_list = (molfile_plugin_t**) PyMolfileCapsule_AsVoidPtr(molcapsule);   
@@ -52,6 +57,12 @@ void del_molfile_file_handle(PyObject* molcapsule)
     Py_XDECREF(molcapsule);
 }
 #else
+void initNumpyArray(void){
+    if(PyArray_API == NULL)
+    {
+        import_array();
+    }
+}
 void del_molfile_plugin_list(void* molcapsule)
 {
     plugin_list = (molfile_plugin_t**) PyMolfileCapsule_AsVoidPtr((PyObject*)molcapsule);   
@@ -201,7 +212,7 @@ PyObject * molfile_plugin_info(PyObject* molcapsule, int plugin_no) {
 PyObject* read_fill_structure(PyObject* molpack, PyObject* prototype)
 {
     //Py_Initialize();
-    import_array();
+    initNumpyArray();
     int options = 0;
     molfile_plugin_t* plugin;
     void* file_handle;
@@ -264,7 +275,7 @@ PyObject* read_fill_structure(PyObject* molpack, PyObject* prototype)
 
 PyObject* read_fill_bonds(PyObject* molpack)
 {
-    import_array();
+    initNumpyArray();
     int options = 0;
     molfile_plugin_t* plugin;
     void* file_handle;
@@ -359,7 +370,7 @@ PyObject* read_fill_bonds(PyObject* molpack)
 
 PyObject* read_fill_angles(PyObject* molpack)
 {
-    import_array();
+    initNumpyArray();
     int options = 0;
     molfile_plugin_t* plugin;
     void* file_handle;
@@ -558,7 +569,7 @@ PyObject* read_fill_angles(PyObject* molpack)
 
 PyObject* read_fill_next_timestep(PyObject* molpack)
 {
-    import_array();
+    initNumpyArray();
     molfile_plugin_t* plugin;
     void* file_handle;
     int numatoms, status;
diff --git a/pymolfile/molfile/pymolfile.h b/pymolfile/molfile/pymolfile.h
index 97019a9..b0c31fb 100644
--- a/pymolfile/molfile/pymolfile.h
+++ b/pymolfile/molfile/pymolfile.h
@@ -22,6 +22,12 @@ extern "C"
 
 #endif
 
+#if PY_VERSION_HEX >= 0x03000000
+#define NUMPY_IMPORT_ARRAY_RETVAL NULL
+#else
+#define NUMPY_IMPORT_ARRAY_RETVAL
+#endif
+
 #include "molfile_plugin.h"
 #include "libmolfile_plugin.h"
 #include "vmdplugin.h"
-- 
GitLab