From 4ecd9c2dd41ae75ec4e82a662a241543fc075c01 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Sun, 18 Mar 2018 11:59:13 -0700 Subject: [PATCH] Fix the Python Console for Python3. Replacing libgncmod-python, libgncmod-core-utils-python, and libgncmod-app-utils-python with _sw_core_utils and _sw_app_utils. The latter two are the modules that init.py wants to load and with Python3 Swig appears to no longer make them available via libgncmod. Note that there may still be some problems with actually using the console, but it at least loads at startup without complaint. --- gnucash/python/CMakeLists.txt | 20 +---- gnucash/python/gncmod-python.c | 130 --------------------------- gnucash/python/init.py | 22 ++--- libgnucash/app-utils/CMakeLists.txt | 28 ++++-- libgnucash/core-utils/CMakeLists.txt | 39 ++++---- po/POTFILES.in | 1 - 6 files changed, 54 insertions(+), 186 deletions(-) delete mode 100644 gnucash/python/gncmod-python.c diff --git a/gnucash/python/CMakeLists.txt b/gnucash/python/CMakeLists.txt index 42855085c5..a6f689a113 100644 --- a/gnucash/python/CMakeLists.txt +++ b/gnucash/python/CMakeLists.txt @@ -1,5 +1,3 @@ -SET(gncmod_python_SOURCES gncmod-python.c) - SET(pycons_DATA pycons/__init__.py pycons/console.py @@ -11,22 +9,6 @@ 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 - ${PYTHON_LIBRARIES} ${GLIB_LIBS}) # ${PYTHON_EXTRA_LIBS} - TARGET_INCLUDE_DIRECTORIES(gncmod-python - PRIVATE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/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) @@ -35,6 +17,6 @@ ENDIF() ENDIF(WITH_PYTHON) SET_LOCAL_DIST(pycons_DIST ${pycons_DATA}) -SET_LOCAL_DIST(python_DIST_local CMakeLists.txt gncmod-python.c init.py) +SET_LOCAL_DIST(python_DIST_local CMakeLists.txt 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 deleted file mode 100644 index 19350d4678..0000000000 --- a/gnucash/python/gncmod-python.c +++ /dev/null @@ -1,130 +0,0 @@ -/********************************************************************* - * 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@gnu.org * - * * -\********************************************************************/ - - -#include -#include -#include -#include - -#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); -#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 : "")); - 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 85febecc26..4ec0febd30 100644 --- a/gnucash/python/init.py +++ b/gnucash/python/init.py @@ -9,7 +9,7 @@ import os sys.path.append(os.path.dirname(__file__)) noisy = gnc_prefs_is_extra_enabled() if noisy: - print "woop", os.path.dirname(__file__) + print("woop", os.path.dirname(__file__)) # Importing the console class causes SIGTTOU to be thrown if GnuCash is # started in the background. This causes a hang if it is not handled, # so ignore it for the duration @@ -22,22 +22,22 @@ import pycons.console as cons signal.signal(signal.SIGTTOU, old_sigttou) if noisy: - print "Hello from python!" - print "test", sys.modules.keys() - print "test2", dir(_sw_app_utils) + print("Hello from python!") + print("test", sys.modules.keys()) + print("test2", dir(_sw_app_utils)) #root = _sw_app_utils.gnc_get_current_root_account() - #print "test", dir(root), root.__class__ - print "test3", dir(gnucash_core_c) + #print("test", dir(root), root.__class__) + print("test3", dir(gnucash_core_c)) #acct = Account(instance = root) - #print "test3", dir(acct) - #print acct.GetName() - #print acct.GetBalance() - #print acct.GetSplitList() - #print "test2", dir(gnucash.gnucash_core_c) + #print("test3", dir(acct)) + #print(acct.GetName()) + #print(acct.GetBalance()) + #print(acct.GetSplitList()) + #print("test2", dir(gnucash.gnucash_core_c)) class Console (cons.Console): """ GTK python console """ diff --git a/libgnucash/app-utils/CMakeLists.txt b/libgnucash/app-utils/CMakeLists.txt index 755ab1e528..13a8f9ee11 100644 --- a/libgnucash/app-utils/CMakeLists.txt +++ b/libgnucash/app-utils/CMakeLists.txt @@ -110,25 +110,35 @@ INSTALL(TARGETS gncmod-app-utils ) IF (WITH_PYTHON) - ADD_LIBRARY (gncmod-app-utils-python ${SWIG_APP_UTILS_PYTHON_C}) + SET(PYEXEC_FILES sw_app_utils.py) + ADD_LIBRARY (sw_app_utils MODULE ${SWIG_APP_UTILS_PYTHON_C}) - TARGET_LINK_LIBRARIES(gncmod-app-utils-python gncmod-app-utils ${app_utils_ALL_LIBRARIES} ${PYTHON_LIBRARIES}) + TARGET_LINK_LIBRARIES(sw_app_utils gncmod-app-utils ${app_utils_ALL_LIBRARIES} ${PYTHON_LIBRARIES}) + SET_TARGET_PROPERTIES(sw_app_utils PROPERTIES PREFIX "_") - TARGET_INCLUDE_DIRECTORIES (gncmod-app-utils-python + TARGET_INCLUDE_DIRECTORIES (sw_app_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} PRIVATE ${app_utils_ALL_INCLUDES} ${PYTHON_INCLUDE_DIRS} ) - TARGET_COMPILE_DEFINITIONS (gncmod-app-utils-python PRIVATE -DG_LOG_DOMAIN=\"gnc.app-utils\") + TARGET_COMPILE_DEFINITIONS (sw_app_utils PRIVATE -DG_LOG_DOMAIN=\"gnc.app-utils\") IF (APPLE) - SET_TARGET_PROPERTIES (gncmod-app-utils-python PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/gnucash") + SET_TARGET_PROPERTIES (sw_app_utils PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/gnucash") ENDIF() - INSTALL(TARGETS gncmod-app-utils-python - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/gnucash - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/gnucash - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + INSTALL(TARGETS sw_app_utils + LIBRARY DESTINATION ${PYTHON_SYSCONFIG_OUTPUT}/gnucash + ARCHIVE DESTINATION ${PYTHON_SYSCONFIG_OUTPUT}/gnucash ) + + ADD_CUSTOM_TARGET(sw-app-utils-py ALL + COMMAND ${CMAKE_COMMAND} -E copy ${SWIG_APP_UTILS_PYTHON_PY} ${PYTHON_SYSCONFIG_BUILD}/gnucash + DEPENDS ${SWIG_APP_UTILS_PYTHON_C}) + + ADD_CUSTOM_TARGET(sw-app-utils-build ALL + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR_BUILD}/gnucash/_sw_app_utils${CMAKE_SHARED_MODULE_SUFFIX} ${PYTHON_SYSCONFIG_BUILD}/gnucash + DEPENDS sw_app_utils) + ENDIF() diff --git a/libgnucash/core-utils/CMakeLists.txt b/libgnucash/core-utils/CMakeLists.txt index 4e21929fe6..befab78a0c 100644 --- a/libgnucash/core-utils/CMakeLists.txt +++ b/libgnucash/core-utils/CMakeLists.txt @@ -167,27 +167,34 @@ INSTALL(TARGETS gnc-core-utils ) IF (WITH_PYTHON) - ADD_LIBRARY (gnc-core-utils-python ${core_utils_ALL_SOURCES} ${SWIG_CORE_UTILS_PYTHON_C}) - ADD_DEPENDENCIES(gnc-core-utils-python gnc-vcs-info) + ADD_LIBRARY (sw_core_utils MODULE ${SWIG_CORE_UTILS_PYTHON_C}) - TARGET_LINK_LIBRARIES(gnc-core-utils-python ${core_utils_ALL_LIBRARIES} ${PYTHON_LIBRARIES}) + TARGET_LINK_LIBRARIES(sw_core_utils gnc-core-utils ${core_utils_ALL_LIBRARIES} ${PYTHON_LIBRARIES}) + SET_TARGET_PROPERTIES(sw_core_utils PROPERTIES PREFIX "_") - TARGET_COMPILE_DEFINITIONS(gnc-core-utils-python - PRIVATE -DG_LOG_DOMAIN=\"gnc.core-utils\" ${GTK_MAC_CFLAGS_OTHER} + TARGET_INCLUDE_DIRECTORIES (sw_core_utils + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE ${core_utils_ALL_INCLUDES} ${PYTHON_INCLUDE_DIRS} + ) + TARGET_COMPILE_DEFINITIONS (sw_core_utils PRIVATE -DG_LOG_DOMAIN=\"gnc.core-utils\") + + IF (CORELE) + SET_TARGET_PROPERTIES (sw_core_utils PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/gnucash") + ENDIF() + + INSTALL(TARGETS sw_core_utils + LIBRARY DESTINATION ${PYTHON_SYSCONFIG_OUTPUT}/gnucash + ARCHIVE DESTINATION ${PYTHON_SYSCONFIG_OUTPUT}/gnucash ) - TARGET_INCLUDE_DIRECTORIES(gnc-core-utils-python PUBLIC ${core_utils_ALL_INCLUDES} ${PYTHON_INCLUDE_DIRS}) - - IF (MAC_INTEGRATION) - TARGET_COMPILE_OPTIONS(gnc-core-utils-python PRIVATE ${OSX_EXTRA_COMPILE_FLAGS}) - ENDIF(MAC_INTEGRATION) - - INSTALL(TARGETS gnc-core-utils-python - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - ) + ADD_CUSTOM_TARGET(sw-core-utils-py ALL + COMMAND ${CMAKE_COMMAND} -E copy ${SWIG_CORE_UTILS_PYTHON_PY} ${PYTHON_SYSCONFIG_BUILD}/gnucash + DEPENDS ${SWIG_CORE_UTILS_PYTHON_C}) + ADD_CUSTOM_TARGET(sw-core-utils-build ALL + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR_BUILD}/gnucash/_sw_core_utils${CMAKE_SHARED_MODULE_SUFFIX} ${PYTHON_SYSCONFIG_BUILD}/gnucash + DEPENDS sw_core_utils) + ENDIF() # No headers to install diff --git a/po/POTFILES.in b/po/POTFILES.in index 0e02226450..dc896a7716 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -360,7 +360,6 @@ 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