gnucash maint: Bug 796737 - Patch to restore gncmod-python.c.
John Ralls
jralls at code.gnucash.org
Sat Jul 7 16:35:16 EDT 2018
Updated via https://github.com/Gnucash/gnucash/commit/4d013e09 (commit)
from https://github.com/Gnucash/gnucash/commit/ad7c14a5 (commit)
commit 4d013e091cc6890238b2c5bea2ef73b4aa37f931
Author: David Osguthorpe <david.osguthorpe at gmail.com>
Date: Sat Jul 7 13:33:22 2018 -0700
Bug 796737 - Patch to restore gncmod-python.c.
Restores the gncmod-python module.
It removes the need to link the module to libgncmod-app-utils.dylib or
libgncmod-core-utils.dylib. This was needed previously as the init
function for those modules was called in the c code. However, unless
there was python c code at some point in gncmod-python.c to use
functions in c of either core utils or app utils these are not needed.
Those module init functions would be called when the modules are
imported in eg init.py, which does indeed import _sw_app_utils
successfully.
I have made edits to init.py (and other files) so it loads without
errors with python 3. These edits are NOT tested. I dont actually use
pycons, I update the init.py to simply import my python subsystem init
module. I never set the if False: to if True: to actually activate the
console.
diff --git a/gnucash/python/CMakeLists.txt b/gnucash/python/CMakeLists.txt
index f617858..a6690dd 100644
--- a/gnucash/python/CMakeLists.txt
+++ b/gnucash/python/CMakeLists.txt
@@ -1,3 +1,5 @@
+set(gncmod_python_SOURCES gncmod-python.c)
+
set(pycons_DATA
pycons/__init__.py
pycons/console.py
@@ -9,6 +11,23 @@ set(pycons_DATA
)
if (WITH_PYTHON)
+
+ add_library(gncmod-python ${gncmod_python_SOURCES})
+ # target_link_libraries(gncmod-python gnc-module gnc-core-utils-python gncmod-app-utils-python
+ target_link_libraries(gncmod-python gnc-module gnc-core-utils
+ ${PYTHON_LIBRARIES} ${GLIB_LIBS}) # ${PYTHON_EXTRA_LIBS}
+ target_include_directories(gncmod-python
+ PRIVATE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libgnucash/core-utils ${CMAKE_SOURCE_DIR}/gnc-module ${PYTHON_INCLUDE_DIR})
+ target_compile_options(gncmod-python PRIVATE -DG_LOG_DOMAIN=\"gnc.python\")
+if (APPLE)
+ set_target_properties (gncmod-python PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/gnucash")
+endif()
+ install(TARGETS gncmod-python
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/gnucash
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/gnucash
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ )
+
install(FILES ${pycons_DATA} DESTINATION ${CMAKE_INSTALL_DATADIR}/gnucash/python/pycons)
install(FILES init.py DESTINATION ${CMAKE_INSTALL_DATADIR}/gnucash/python)
@@ -17,6 +36,6 @@ if (WITH_PYTHON)
endif(WITH_PYTHON)
set_local_dist(pycons_DIST ${pycons_DATA})
-set_local_dist(python_DIST_local CMakeLists.txt init.py)
+set_local_dist(python_DIST_local CMakeLists.txt gncmod-python.c init.py)
set(python_DIST ${python_DIST_local} ${pycons_DIST} PARENT_SCOPE)
diff --git a/gnucash/python/gncmod-python.c b/gnucash/python/gncmod-python.c
new file mode 100644
index 0000000..15f94ec
--- /dev/null
+++ b/gnucash/python/gncmod-python.c
@@ -0,0 +1,133 @@
+/*********************************************************************
+ * gncmod-python.c
+ * Python in GnuCash?! Sweet.
+ *
+ * Copyright (c) 2011 Andy Clayton
+ *********************************************************************/
+/********************************************************************\
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License as *
+ * published by the Free Software Foundation; either version 2 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact: *
+ * *
+ * Free Software Foundation Voice: +1-617-542-5942 *
+ * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
+ * Boston, MA 02110-1301, USA gnu at gnu.org *
+ * *
+\********************************************************************/
+
+
+#include <Python.h>
+#include <config.h>
+#include <gmodule.h>
+#include <stdio.h>
+
+#include "gnc-module.h"
+#include "gnc-module-api.h"
+#include "gnc-path.h"
+
+GNC_MODULE_API_DECL(libgncmod_python)
+
+/* version of the gnc module system interface we require */
+int libgncmod_python_gnc_module_system_interface = 0;
+
+/* module versioning uses libtool semantics. */
+int libgncmod_python_gnc_module_current = 0;
+int libgncmod_python_gnc_module_revision = 0;
+int libgncmod_python_gnc_module_age = 0;
+
+
+char *
+libgncmod_python_gnc_module_path(void)
+{
+ return g_strdup("gnucash/python");
+}
+
+char *
+libgncmod_python_gnc_module_description(void)
+{
+ return g_strdup("An embedded Python interpreter");
+}
+
+#if PY_VERSION_HEX >= 0x03000000
+//extern PyObject* PyInit__sw_app_utils(void);
+//extern PyObject* PyInit__sw_core_utils(void);
+#else
+//extern void init_sw_app_utils(void);
+//extern void init_sw_core_utils(void);
+#endif
+
+int
+libgncmod_python_gnc_module_init(int refcount)
+{
+ /* There isn't yet a python module to init.
+ PyObject *pName, *pModule;
+ */
+ FILE *fp;
+ gchar *pkgdatadir, *init_filename;
+#if PY_VERSION_HEX >= 0x03000000
+ wchar_t* argv = NULL;
+#else
+ char* argv = "";
+#endif
+ Py_Initialize();
+ PySys_SetArgv(0, &argv);
+ // I dont quite understand why these are loaded here
+ // - these are python modules so should be able to just import them
+ // in init.py
+#if PY_VERSION_HEX >= 0x03000000
+ //PyInit__sw_app_utils();
+ //PyInit__sw_core_utils();
+#else
+ //init_sw_app_utils();
+ //init_sw_core_utils();
+#endif
+
+ /* There isn't yet a python module to init.
+ pName = PyString_FromString("path/to/init.py");
+ pModule = PyImport_Import(pName);
+
+ if (!pModule) {
+ PyErr_Print();
+ return FALSE;
+ }
+
+ Py_DECREF(pName);
+ Py_DECREF(pModule);
+ */
+
+ pkgdatadir = gnc_path_get_pkgdatadir();
+ init_filename = g_build_filename(pkgdatadir, "python/init.py", (char*)NULL);
+ g_debug("Looking for python init script at %s", (init_filename ? init_filename : "<null>"));
+ fp = fopen(init_filename, "r");
+ if (fp)
+ {
+ PyRun_SimpleFile(fp, init_filename);
+ fclose(fp);
+
+ /* PyRun_InteractiveLoop(stdin, "foo"); */
+ }
+ else
+ {
+ g_warning("Unable to initialize Python module (unable to open %s)", init_filename);
+ }
+ g_free(init_filename);
+ g_free(pkgdatadir);
+
+ return TRUE;
+}
+
+int
+libgncmod_python_gnc_module_end(int refcount)
+{
+ Py_Finalize();
+ return TRUE;
+}
diff --git a/gnucash/python/init.py b/gnucash/python/init.py
index 4ec0febd..ca96f12 100644
--- a/gnucash/python/init.py
+++ b/gnucash/python/init.py
@@ -1,7 +1,7 @@
import sys
-import _sw_app_utils
+import gnucash._sw_app_utils as _sw_app_utils
from gnucash import *
-from _sw_core_utils import gnc_prefs_is_extra_enabled
+from gnucash._sw_core_utils import gnc_prefs_is_extra_enabled
from gi import require_version
require_version('Gtk', '3.0')
from gi.repository import Gtk
diff --git a/gnucash/python/pycons/console.py b/gnucash/python/pycons/console.py
index 6a070b8..760c498 100644
--- a/gnucash/python/pycons/console.py
+++ b/gnucash/python/pycons/console.py
@@ -31,12 +31,14 @@ import sys
import re
import tempfile
import readline
+import gi
+gi.require_version('Gtk', '3.0')
from gi.repository import GObject
from gi.repository import Gtk
from gi.repository import Pango
-from StringIO import StringIO
-import shell
-try: import ishell
+import io
+import pycons.shell as shell
+try: import pycons.ishell as ishell
except: pass
ansi_colors = {'0;30': '#2E3436',
@@ -79,8 +81,8 @@ class ConsoleOut:
def writelines(self, l):
for s in l:
self.console.write (s, self.style)
- def seek(self, a): raise IOError, (29, 'Illegal seek')
- def tell(self): raise IOError, (29, 'Illegal seek')
+ def seek(self, a): raise IOError(29, 'Illegal seek')
+ def tell(self): raise IOError(29, 'Illegal seek')
truncate = tell
@@ -113,8 +115,8 @@ class ConsoleIn:
def readlines(self): return []
def write(self, s): return None
def writelines(self, l): return None
- def seek(self, a): raise IOError, (29, 'Illegal seek')
- def tell(self): raise IOError, (29, 'Illegal seek')
+ def seek(self, a): raise IOError(29, 'Illegal seek')
+ def tell(self): raise IOError(29, 'Illegal seek')
truncate = tell
@@ -179,7 +181,7 @@ class Console (Gtk.ScrolledWindow):
# Console stuff
self.argv = argv
self.history_init(filename, size)
- self.cout = StringIO()
+ self.cout = io.StringIO()
self.cout.truncate(0)
if shelltype=='ipython':
self.shell = ishell.Shell(argv,locals(),globals(),
diff --git a/gnucash/python/pycons/shell.py b/gnucash/python/pycons/shell.py
index d50043e..dfdc0d8 100644
--- a/gnucash/python/pycons/shell.py
+++ b/gnucash/python/pycons/shell.py
@@ -153,9 +153,9 @@ class Shell:
console.write (buf, 'output')
if len(buf) < 256: break
# Command output
- print(`r`)
+ print(repr(r))
except SyntaxError:
- exec self.command in self.globals
+ exec(self.command in self.globals)
except:
if hasattr (sys, 'last_type') and sys.last_type == SystemExit:
console.quit()
diff --git a/po/POTFILES.in b/po/POTFILES.in
index b8cc820..c7924e8 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -361,6 +361,7 @@ gnucash/import-export/qif-imp/qif-parse.scm
gnucash/import-export/qif-imp/qif-to-gnc.scm
gnucash/import-export/qif-imp/qif-utils.scm
gnucash/import-export/qif-imp/string.scm
+gnucash/python/gncmod-python.c
gnucash/register/ledger-core/gncEntryLedger.c
gnucash/register/ledger-core/gncEntryLedgerControl.c
gnucash/register/ledger-core/gncEntryLedgerDisplay.c
Summary of changes:
gnucash/python/CMakeLists.txt | 21 ++++++-
gnucash/python/gncmod-python.c | 133 +++++++++++++++++++++++++++++++++++++++
gnucash/python/init.py | 4 +-
gnucash/python/pycons/console.py | 18 +++---
gnucash/python/pycons/shell.py | 4 +-
po/POTFILES.in | 1 +
6 files changed, 168 insertions(+), 13 deletions(-)
create mode 100644 gnucash/python/gncmod-python.c
More information about the gnucash-changes
mailing list