From 7a7597500b70a15fc3fc6d71e6580b3ecfa0f0c1 Mon Sep 17 00:00:00 2001 From: David Sansome <davidsansome@gmail.com> Date: Sun, 2 Jan 2011 01:33:54 +0000 Subject: [PATCH] Set __path__ properly so scripts can import other modules, and put all scripts in a namespace --- src/scripting/python/pythonengine.cpp | 4 ++++ src/scripting/python/pythonscript.cpp | 12 ++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/scripting/python/pythonengine.cpp b/src/scripting/python/pythonengine.cpp index ef34a0b68..06c8e3a4a 100644 --- a/src/scripting/python/pythonengine.cpp +++ b/src/scripting/python/pythonengine.cpp @@ -89,6 +89,10 @@ Script* PythonEngine::CreateScript(const QString& path, AddObject(manager()->data().player_, sipType_Player, "player"); AddObject(this, sipType_PythonEngine, "pythonengine"); + // Create a module for scripts + PyObject* scripts_module = PyImport_AddModule("clementinescripts"); + Py_DECREF(scripts_module); + // Run the startup script - this redirects sys.stdout and sys.stderr to our // log handler. QFile python_startup(":pythonstartup.py"); diff --git a/src/scripting/python/pythonscript.cpp b/src/scripting/python/pythonscript.cpp index f1e167fbd..63deef669 100644 --- a/src/scripting/python/pythonscript.cpp +++ b/src/scripting/python/pythonscript.cpp @@ -47,17 +47,21 @@ bool PythonScript::Init() { // Create a module for this script // TODO: allowed characters? - PyObject* module = PyImport_AddModule(id().toAscii().constData()); + PyObject* module = PyImport_AddModule(("clementinescripts." + id()).toAscii().constData()); PyObject* dict = PyModule_GetDict(module); // Add __builtins__ PyObject* builtin_mod = PyImport_ImportModule("__builtin__"); PyModule_AddObject(module, "__builtins__", builtin_mod); - Py_DECREF(builtin_mod); // Set __file__ PyModule_AddStringConstant(module, "__file__", script_file().toLocal8Bit().constData()); + // Set __path__ + PyObject* __path__ = PyList_New(1); + PyList_SetItem(__path__, 0, PyString_FromString(path().toLocal8Bit().constData())); + PyModule_AddObject(module, "__path__", __path__); + // Set script PyObject* script = engine_->sip_api()->api_convert_from_type( interface(), sipType_ScriptInterface, NULL); @@ -67,8 +71,8 @@ bool PythonScript::Init() { FILE* stream = fdopen(file.handle(), "r"); // Run the script - PyObject* result = PyRun_File( - stream, script_file().toLocal8Bit().constData(), Py_file_input, dict, dict); + PyObject* result = PyRun_File(stream, + script_file().toLocal8Bit().constData(), Py_file_input, dict, dict); if (result == NULL) { engine_->AddLogLine("Could not execute file", true); PyErr_Print();