diff --git a/src/if_python.c b/src/if_python.c
index 8185fc136f1a9790f94b6f32aa6fa2371b5cf2da..95be357245e363aa70aac2cba7a4f5d7e54f8370 100644
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -343,6 +343,16 @@ python_runtime_link_init(char *libname, int verbose)
 {
     int i;
 
+#if defined(UNIX) && defined(FEAT_PYTHON3)
+    /* Can't have Python and Python3 loaded at the same time, it may cause a
+     * crash. */
+    if (python3_loaded())
+    {
+	EMSG(_("E999: Python: Cannot use :py and :py3 in one session"));
+	return FAIL;
+    }
+#endif
+
     if (hinstPython)
 	return OK;
     hinstPython = load_dll(libname);
@@ -519,6 +529,14 @@ python_end()
     --recurse;
 }
 
+#if (defined(DYNAMIC_PYTHON) && defined(FEAT_PYTHON3)) || defined(PROTO)
+    int
+python_loaded()
+{
+    return (hinstPython != 0);
+}
+#endif
+
     static int
 Python_Init(void)
 {
diff --git a/src/if_python3.c b/src/if_python3.c
index 238f968b3f2e99821cb29e019b452a9a6fbb2447..8958e0ae29dc3caa6d0973b7be9cfc0f15467037 100644
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -306,7 +306,7 @@ static struct
  */
 static void end_dynamic_python3(void)
 {
-    if (hinstPy3)
+    if (hinstPy3 != 0)
     {
 	close_dll(hinstPy3);
 	hinstPy3 = 0;
@@ -323,7 +323,17 @@ static int py3_runtime_link_init(char *libname, int verbose)
     int i;
     void *ucs_from_string, *ucs_from_string_and_size;
 
-    if (hinstPy3)
+#if defined(UNIX) && defined(FEAT_PYTHON)
+    /* Can't have Python and Python3 loaded at the same time, it may cause a
+     * crash. */
+    if (python_loaded())
+    {
+	EMSG(_("E999: Python: Cannot use :py and :py3 in one session"));
+	return FAIL;
+    }
+#endif
+
+    if (hinstPy3 != 0)
 	return OK;
     hinstPy3 = load_dll(libname);
 
@@ -506,6 +516,14 @@ void python3_end()
     --recurse;
 }
 
+#if (defined(DYNAMIC_PYTHON) && defined(FEAT_PYTHON)) || defined(PROTO)
+    int
+python3_loaded()
+{
+    return (hinstPy3 != 0);
+}
+#endif
+
 static int Python3_Init(void)
 {
     if (!py3initialised)
diff --git a/src/proto/if_python.pro b/src/proto/if_python.pro
index 793b6eeb5da6ca9c17b0c3c11e8d8722dad6a3ab..ec12402501f34b3bc0bb535f769f1cd51dd0446a 100644
--- a/src/proto/if_python.pro
+++ b/src/proto/if_python.pro
@@ -1,6 +1,7 @@
 /* if_python.c */
 int python_enabled __ARGS((int verbose));
 void python_end __ARGS((void));
+int python_loaded __ARGS((void));
 void ex_python __ARGS((exarg_T *eap));
 void ex_pyfile __ARGS((exarg_T *eap));
 void python_buffer_free __ARGS((buf_T *buf));
diff --git a/src/proto/if_python3.pro b/src/proto/if_python3.pro
index f9921e1c9ae28ede5d8d690eb5961e90f265bdea..9c132c3dce30c09301d47027791e420b23b6f378 100644
--- a/src/proto/if_python3.pro
+++ b/src/proto/if_python3.pro
@@ -1,6 +1,7 @@
 /* if_python3.c */
 int python3_enabled __ARGS((int verbose));
 void python3_end __ARGS((void));
+int python3_loaded __ARGS((void));
 void ex_py3 __ARGS((exarg_T *eap));
 void ex_py3file __ARGS((exarg_T *eap));
 void python3_buffer_free __ARGS((buf_T *buf));