Closed rikvermeer closed 4 years ago
@rikvermeer Thanks for this issue.
The API has changed recently, and PyNode calls are now async. The last parameter should be a function (error, result) => {}
const pynode = require('@fridgerator/pynode')
pynode.startInterpreter()
pynode.appendSysPath('./')
pynode.openFile('test')
pynode.call('add', 1, 2, (err, result) => {
if (err) return console.log('error : ', err)
result === 3 // true
})
However your issue exposed something, that is I need to check that the last parameter passed is a function.
Or if you prefer using a promise:
const { promisify } = require('util')
const call = promisify(nodePython.call)
call('add', 1, 2)
.then(result => console.log(result))
.catch(error => console.log(error))
Thanks for your advice using a promise. Can I use await in the assignment manner suggested by rikvermeer by using var result = await call('add',1,2);
Hi again and thanks for the quick reply!
Im getting a segfault. Can't run valgrind on my current Darwin. I'll try running a debug build of node; maybe i can find some pointers.
cat ./test.py
def add(a, b):
return a + b
if __name__ == '__main__':
print(add(1, 2))
python3 ./test.py
3
cat index.js
const pynode = require('@fridgerator/pynode');
pynode.startInterpreter();
pynode.appendSysPath('/');
pynode.openFile('test');
pynode.call('add', 1, 2, (err, result) => {
//if(err) console.warn(err);
//console.log(result);
//result === 3
});
node ./index.js
[1] 28895 segmentation fault node ./index.js
And with util.promisify
cat index2.js
const pynode = require('@fridgerator/pynode');
const { promisify } = require('util');
const call = promisify(pynode.call);
call('add', 1, 2)
.then(result => console.log(result))
.catch(error => console.log(error));
node index2.js
[1] 78858 segmentation fault node index2.js
The following works though:
pynode.eval("print('hallo')");
Right now if python cant find the function to call it just fails (segfault). I'm working on fixing this in another branch among other things (multithreading support).
I would guess that its not finding the add
function. If you change pynode.appendSysPath('/');
to pynode.appendSysPath('./');
does this fix the issue?
Ofcourse! It combined nicely with the 'test' module on the venv's syspath :)
Maybe you can add distinction between file loading and module loading?
Yes I should, openFile
is misleading as its really importing a module / file.
I made a venv which works (python 3.7). The module compiles (node 12), yet I'm getting:
node index.js
cat index.js
cat test.py