summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide/pychrysa.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-01-26 12:40:43 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-01-26 12:40:43 (GMT)
commit135a05b755d4dcf8c3fadc7befe6229dfcdc1e4f (patch)
treea76c323b752a4de751088c784b5575b90e029f9b /plugins/pychrysalide/pychrysa.c
parentdff8fd4c83d9833d4539e2dd0c9d3f998b73608f (diff)
Loaded Python plugins even from the Python interpreter.
Diffstat (limited to 'plugins/pychrysalide/pychrysa.c')
-rw-r--r--plugins/pychrysalide/pychrysa.c93
1 files changed, 74 insertions, 19 deletions
diff --git a/plugins/pychrysalide/pychrysa.c b/plugins/pychrysalide/pychrysa.c
index 502bf20..928743d 100644
--- a/plugins/pychrysalide/pychrysa.c
+++ b/plugins/pychrysalide/pychrysa.c
@@ -94,6 +94,9 @@ static bool is_current_abi_suitable(void);
/* Définit la version attendue de GTK à charger dans Python. */
static bool set_version_for_gtk_namespace(const char *);
+/* Complète les chemins de recherches de Python. */
+static void extend_python_path(const char *);
+
/* Charge autant de greffons composés en Python que possible. */
static void load_python_plugins(GPluginModule *);
@@ -347,6 +350,27 @@ PyMODINIT_FUNC PyInit_pychrysalide(void)
};
+ /**
+ * Vérification préalable : dans le cas où on est embarqué directement dans
+ * un interpréteur Python, le module se charge et termine par charger à leur
+ * tour les différentes extensions trouvées, via load_remaning_plugins() puis
+ * chrysalide_plugin_on_native_loaded().
+ *
+ * Lesquelles vont très probablement charger le module pychrysalide.
+ *
+ * Comme le chargement de ce dernier n'est alors pas encore terminé,
+ * Python va relancer cette procédure, et register_access_to_python_module()
+ * va détecter un doublon.
+ */
+
+ result = get_access_to_python_module(py_chrysalide_module.m_name);
+
+ if (result != NULL)
+ {
+ Py_INCREF(result);
+ return result;
+ }
+
if (!is_current_abi_suitable())
return NULL;
@@ -445,6 +469,37 @@ PyMODINIT_FUNC PyInit_pychrysalide(void)
}
+/******************************************************************************
+* *
+* Paramètres : path = chemin supplémentaire pour l'espace de recherche. *
+* *
+* Description : Complète les chemins de recherches de Python. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void extend_python_path(const char *path)
+{
+ PyObject *list; /* Liste de chemins à compléter*/
+ PyObject *new; /* Nouveau chemin à intégrer */
+
+ list = PySys_GetObject("path");
+ assert(list != NULL);
+
+ new = PyUnicode_FromString(path);
+ assert(new != NULL);
+
+ PyList_Append(list, new);
+
+ Py_DECREF(new);
+
+ add_to_env_var("PYTHONPATH", path, ":");
+
+}
+
/******************************************************************************
* *
@@ -460,15 +515,33 @@ PyMODINIT_FUNC PyInit_pychrysalide(void)
static void load_python_plugins(GPluginModule *plugin)
{
+ DIR *dir; /* Répertoire à parcourir */
char *paths; /* Emplacements de greffons */
char *save; /* Sauvegarde pour ré-entrance */
char *path; /* Chemin à fouiller */
- DIR *dir; /* Répertoire à parcourir */
struct dirent *entry; /* Elément trouvé */
char *modname; /* Nom du module pour Python */
char *filename; /* Chemin d'accès reconstruit */
GPluginModule *pyplugin; /* Lien vers un grffon Python */
+ /* Définition des zones d'influence */
+
+ dir = opendir(PLUGINS_DATA_DIR G_DIR_SEPARATOR_S "python");
+
+ if (dir != NULL)
+ {
+ closedir(dir);
+ extend_python_path(PLUGINS_DATA_DIR G_DIR_SEPARATOR_S "python");
+ }
+ else
+ extend_python_path(PACKAGE_SOURCE_DIR G_DIR_SEPARATOR_S "plugins" G_DIR_SEPARATOR_S "python");
+
+ g_plugin_module_log_variadic_message(plugin, LMT_INFO,
+ _("PYTHONPATH environment variable set to '%s'"),
+ getenv("PYTHONPATH"));
+
+ /* Chargements des extensions Python */
+
paths = get_env_var("PYTHONPATH");
save = NULL; /* gcc... */
@@ -563,28 +636,10 @@ static void load_python_plugins(GPluginModule *plugin)
G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin)
{
bool result; /* Bilan à retourner */
- DIR *dir; /* Répertoire à parcourir */
int ret; /* Bilan de préparatifs */
_this = plugin;
- /* Définition des zones d'influence */
-
- dir = opendir(PLUGINS_DATA_DIR G_DIR_SEPARATOR_S "python");
-
- if (dir != NULL)
- {
- closedir(dir);
- add_to_env_var("PYTHONPATH", PLUGINS_DATA_DIR G_DIR_SEPARATOR_S "python", ":");
- }
- else
- add_to_env_var("PYTHONPATH", PACKAGE_SOURCE_DIR G_DIR_SEPARATOR_S "plugins" \
- G_DIR_SEPARATOR_S "python", ":");
-
- g_plugin_module_log_variadic_message(plugin, LMT_INFO,
- _("PYTHONPATH environment variable set to '%s'"),
- getenv("PYTHONPATH"));
-
/* Chargement du module pour Python */
ret = PyImport_AppendInittab("pychrysalide", &PyInit_pychrysalide);