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));