Commit Graph

21 Commits

Author SHA1 Message Date
Mark Liversedge
43d264e3cb PYTHON3_VERSION set from PY_MINOR_VERSION
.. so we don't have to remember !
2018-04-20 08:38:37 +01:00
Ale Martinez
9751876703 Check the python3 version used to build matches the one found at runtime
To avoid crashes on Py_Initialize when 3.6 build finds 3.5 or vice-versa
Python integration is disabled and the used is notified if it was enabled.
2018-04-19 12:40:18 -03:00
Ale Martinez
698ea4eb0b Added ScriptContext for Python APIs called from DataFilter scripts
Carry RideItem, Specification and Metrics to consider the cases when
the script is part of a UserMetric or an LTMPlot formula
Python series, activityWbal and activityXdata honor RideItem and Specification
Python activityMetrics honors ScriptContext RideItem and Metrics
Python activityMeanMax honors ScriptContext RideItem
Force recomputation of metrics just in case Python Scripts were used before
2018-04-08 10:59:43 -03:00
TuxedoFish
1dc00b8bd3 Setenv PYTHONHOME not Py_SetPythonHome
.. what a clusterfuck the Python embedding API is. If you set PYTHONHOME
   it loses PYTHONPATH. But only on a Mac. Go figure.

.. so we just set the environment to the user defined value in prefs.
2018-02-15 15:57:02 +00:00
Mark Liversedge
ef68066f7f Don't bug user if R/Python not compatible
.. most users don't care and will freak out.

.. also set PYTHONHOME if user specified (this helps users on
   MacOS use their local modules).
2018-02-15 15:10:30 +00:00
TuxedoFish
47f439d1bc Fixup Python search for Mac
.. PYTHONHOME/bin/python3 not PYTHONHOME/python3 on MacOS when installed
   within the framework directory.
2018-02-11 17:06:29 +00:00
Mark Liversedge
b50c034f4e Python Startup 2 of 2
.. honour PYTHONHOME environment variable

.. allow user to set PYTHONHOME in preferences, and check its a decent
   value before setting it.
2018-02-10 20:39:40 +00:00
Mark Liversedge
6d78bd165c Python Startup 1 of 2 Windows Fixups
.. fixup trivial issues like PATHSEP and separators in general.

.. it seems that Py_SetProgramName will drive the initialisation of the
   Python interpreter to set sys.path, sys.prefix and sys.exec_prefix.

.. rather than trying to fixup these directly instead we set the program
   name to the python installed binary (full path).

.. you still need python in your path, will fixup in part 2.

.. lastly, also added a 'printd' macro to embed debug info, which can
   be enabled in gcconfig.pri via DEFINES += PYTHON_DEBUG=true
2018-02-10 10:16:24 +00:00
Mark Liversedge
710cddf664 Python Startup 1 of 2
.. look for python in path and check version and module path, then
   use this when initialising to ensure the installed modules
   are used, not the local copy.

.. needs testing on Windows and need to enable the user to specify
   the location of Python so users don't need to modify PATH.
2018-02-09 19:30:35 +00:00
Mark Liversedge
954570fe16 Python Embedding is optional and check install
.. make python embedding optional, if it's not installed then
   disable in preferences (new checkbox similar to R).
2018-02-05 16:27:00 +00:00
Mark Liversedge
8e3a170d94 DataFilter Embed Python Scripts
.. allow the user to embed a python script into a datafilter.

.. this is primarily to enable the use of python when writing
   user metrics.

.. the syntax is basically "%%python script %%" and it is
   evaluated as an expresssion so the results can be assigned
   to a variable or returned as a value.

.. additionally GC.result(double) has been added to the python
   API to enable a return value to be set by the script.

.. since Python is really sensitive about white space its going
   to be best practice to embed python scripts without honoring
   any of the data filter spacing, for example:

{
   value {
      t <-

%%python
GC.result(100)
%%;

   }
}

  .. is likely to be a sensible way to use this.

  .. also notice how the ; is needed after the expression. This
     is because %%python ... %% is a numeric expression with the
     same semantics as "1 + 2"
2018-01-29 10:03:41 +00:00
Mark Liversedge
3304e6c72e Fix Linux SEGV for symbol conflict
.. mad conflict .. where scipy.stats.linregress conflicts
   with a sndfile and crashes when calling sf_check_fpe

.. see fix stolen from here: https://github.com/scipy/scipy/issues/8130
2017-12-21 16:42:08 +00:00
Mark Liversedge
385b56ee47 Python GC.activity()
.. very basic API as we develop out, it just returns a dict
   for now. Need to expand to enable returning a list if
   compare mode is active (like R).

.. implemented in a new source file Resources/python/library.py
   which is loaded directly after the interpreter is loaded at
   startup.

.. also updated src.pro to add library.py and goldencheetah.sip
   to OTHER_FILES so they can be edited easily in QtCreator.
2017-12-09 19:52:59 +00:00
Mark Liversedge
db3d119f7d Python GC.athlete()
Basic proof of concept for CPP binding using SIP but with
our own type conversion (to avoid overhead of SIP lib/deploy).
Its far from perfect but will serve as a starting point.

.. needed to fixup type conversion in goldencheetah.sip to
   convert returning QString as PyUnicode

.. needed to fixup passing context when multi-threaded

.. needed to fixup Bindings.h/cpp to offer new API
2017-12-04 15:20:43 +00:00
Mark Liversedge
29558420b6 remove debug
.. sigh
2017-12-02 20:09:30 +00:00
Mark Liversedge
00144effd8 Python Module Framework
.. Using SIP thats used in PyQt et al we have a module
   called `goldencheetah' which includes bindings.

   Currently there is only a single method `getValue()'
   that returns 1. It's to get the basic plumbing in place.

   src/Python/SIP contains all the files related to the
   module. The cpp files are generated by the `sip' utility
   which will need to be available if you want to work on the
   bindings. Run make -f Makefile.hack to regenerate the cpp
   files if you edit them.

   I prefer to distribute the generated files at this point
   whilst development occurs. We may change that at a later
   date.

.. Please note that the gcconfig.pri.in file has changed as
   we now include the python include path rather than set a
   macro for the include directive (See PYTHONINCLUDES in
   gcconfig.pri.in)

.. lastly, to test this is working in a python chart console:
   > print(GC.getValue())
   1
   >
2017-12-02 16:33:54 +00:00
Mark Liversedge
ab82ea004f ESC or ^C to stop long running Python script
.. when a chart script gets caught in a runaway loop let the
   user interrupt it with the ESC or ^C key.
2017-11-24 19:32:07 +00:00
Mark Liversedge
0662a41ebb Python Script Exec
.. runs in thread to avoid blocking GUI actions but GUI
   will still wait for script to complete. ESC is trapped,
   but mechanism to stop script not implemented yet.
2017-11-23 22:51:41 +00:00
Mark Liversedge
82c06b4b29 Python Chart Console
.. issue commands and have them run in the python interpreter.
.. output and errors are captured
2017-11-22 21:13:59 +00:00
Mark Liversedge
1874ddaaeb Python Chart
.. added a python chart type, it doesn't execute code
   yet. Just a reimplementation of the RChart UX

.. next we need to trap output and run code on selection
   before proceeding to setting an API for Data and Charting
2017-11-22 18:20:00 +00:00
Mark Liversedge
0a2ac3aa6b Start Python Embedding
.. just bootstrapping, so Python is loaded and version
   number made available in the about box.

.. see gcconfig.pri.in and src.pro for settings needed

.. not considering threading etc at this point
2017-11-22 15:50:22 +00:00