diff --git a/python/buildPythonInterface.py b/python/buildPythonInterface.py
index ffb33307a2c951fe3e8e2fcbf0bf53e793e89c14..ff7fd60bda94c6a54f98aa1903763c44253a852c 100644
--- a/python/buildPythonInterface.py
+++ b/python/buildPythonInterface.py
@@ -38,7 +38,7 @@ plumedversion = subprocess.check_output(['grep','-v','#','../VERSION']).decode("
 print( "Module name " + plumedname )
 print( "Version number " + plumedversion )
 
-extra_compile_args=['-D__PLUMED_HAS_DLOPEN','-D__PLUMED_WRAPPER_LINK_RUNTIME=1','-D__PLUMED_WRAPPER_CXX=1','-D__PLUMED_WRAPPER_IMPLEMENTATION=1','-D__PLUMED_WRAPPER_EXTERN=0'] 
+extra_compile_args=['-D__PLUMED_HAS_DLOPEN','-D__PLUMED_WRAPPER_LINK_RUNTIME=1','-D__PLUMED_WRAPPER_CXX=1','-D__PLUMED_WRAPPER_IMPLEMENTATION=1','-D__PLUMED_WRAPPER_EXTERN=0','-D__PLUMED_WRAPPER_CXX_DEFAULT_INVALID=1'] 
 
 defaultkernel=os.getenv("default_kernel")
 if defaultkernel is not None:
diff --git a/python/cplumed.pxd b/python/cplumed.pxd
index 513ec72be52e781b855559ffaea3ee5225fabd38..4535d36c53aa6b4d6d54b5bc6ec22a7974f48a4c 100644
--- a/python/cplumed.pxd
+++ b/python/cplumed.pxd
@@ -33,3 +33,7 @@ cdef extern from "Plumed.h" namespace "PLMD":
          void cmd(const char*key, const void*val) except +
          void cmd(const char*key) except +
          bool valid() except +
+         @staticmethod
+         Plumed dlopen(const char*path) except +
+         @staticmethod
+         Plumed makeValid() except +
diff --git a/python/plumed.pyx b/python/plumed.pyx
index 96b99f335447bf7ec1916f96656257098c06494f..1a897863a3871a35949bfcb05a6784714e533e39 100644
--- a/python/plumed.pyx
+++ b/python/plumed.pyx
@@ -30,9 +30,19 @@ cimport numpy as np
 
 cdef class Plumed:
      cdef cplumed.Plumed c_plumed
-     def __cinit__(self):
-         if not self.c_plumed.valid():
-              raise RuntimeError("PLUMED not available, check your PLUMED_KERNEL environment variable")
+     def __cinit__(self,kernel=None):
+         cdef bytes py_kernel
+         cdef char* ckernel
+         if kernel is None:
+            self.c_plumed=cplumed.Plumed.makeValid()
+            if not self.c_plumed.valid():
+                 raise RuntimeError("PLUMED not available, check your PLUMED_KERNEL environment variable")
+         else:
+            py_kernel= kernel.encode()
+            ckernel = py_kernel
+            self.c_plumed=cplumed.Plumed.dlopen(ckernel)
+            if not self.c_plumed.valid():
+                 raise RuntimeError("Error loading PLUMED kernel at path " + kernel)
          cdef int pres = 8
          self.c_plumed.cmd( "setRealPrecision", <void*>&pres )
      def cmd_ndarray_real(self, ckey, val):