Files
dev/script/__Lib/jeputils.js
2019-03-20 13:52:00 +01:00

148 lines
3.5 KiB
JavaScript

///////////////////////////////////////////////////////////////////////////////////////////////////
// Facade to JEP: Embedded Python
///////////////////////////////////////////////////////////////////////////////////////////////////
//Matplotlib won't work out of the box because it's default backend (Qt) uses signals, which only works in
//the main thread. Ideally should find a fix, in order to mark the running thread as the main.
//As a workaround, one can use the Tk backend:
//
//import matplotlib
//matplotlib.use('TkAgg')
importClass(java.io.File)
importClass(java.lang.Thread)
Jep = Java.type('jep.Jep')
NDArray = Java.type('jep.NDArray')
__jep = {}
function __get_jep(){
t = java.lang.Thread.currentThread()
if (!(t in __jep)){
init_jep()
}
return __jep[t]
}
function __close_jep(){
t = java.lang.Thread.currentThread()
if (t in __jep){
__jep[t].close()
}
}
function init_jep(){
//TODO: Should do it but generates errors
//__close_jep()
j = new Jep(false)
//Faster, but statements must be complete
j.setInteractive(false)
__jep[java.lang.Thread.currentThread()] = j
j.eval("import sys")
//sys.argv is not present in JEP and may be needed for certain modules (as Tkinter)
j.eval("sys.argv = ['PShell']");
//Add standard script path to python path
j.eval("sys.path.append('" + get_context().setup.getScriptPath() + "')")
//Redirect stdout
j.eval("class JepStdout:\n" +
" def write(self, str):\n" +
" self.str += str\n" +
" def clear(self):\n" +
" self.str = ''\n" +
" def flush(self):\n" +
" pass\n")
j.eval("sys.stdout=JepStdout()")
j.eval("sys.stderr=JepStdout()")
j.eval("sys.stdout.clear()")
j.eval("sys.stderr.clear()")
}
function __print_stdout(){
j=__get_jep()
output = j.getValue("sys.stdout.str")
err = j.getValue("sys.stderr.str")
j.eval("sys.stdout.clear()")
j.eval("sys.stderr.clear()")
if ((output != null) && (output.length>0)){
print (output)
}
if ((err != null) && (err.length>0)){
java.lang.System.err.println(err)
}
}
function run_jep(script_name, vars){
if (!script_name.toLowerCase().endsWith(".py")){
script_name += ".py"
}
if (!is_defined(vars)) {
vars = {};
}
script = get_context().scriptManager.library.resolveFile(script_name)
if (script == null){
script= new File(script_name).getAbsolutePath()
}
j=__get_jep()
for (var v in vars){
j.set(v, vars[v])
}
try{
j.runScript(script)
} finally {
__print_stdout()
}
}
function eval_jep(line){
j=__get_jep()
try{
j.eval(line)
} finally {
__print_stdout()
}
}
function set_jep(v, value){
j=__get_jep()
j.set(v, value)
}
function get_jep(v){
j=__get_jep()
return j.getValue(v)
}
function call_jep(module, func, args){
if (!is_defined(args)) {
args = [];
}
j=__get_jep()
f = module+"_" + func +"_"+ j.hashCode()
try{
eval_jep("from " + module + " import " + func + " as " + f)
ret = j.invoke(f, to_array(args,'o'))
} finally {
__print_stdout()
}
return ret
}
function to_npa(data, dimensions, type){
if (!is_defined(dimensions)) {
dimensions = null;
}
if (!is_defined(type)) {
type='d'
}
data = to_array(data, type)
return new NDArray(data, dimensions)
}