Most robust and simple Python bridge. Features, and comparisons to other Python bridges below, supports Windows.
API
View documentation with TypeScript examples.
npm install python-bridge
'use strict'; let assert = ;let pythonBridge = ; let python = ; pythonex`import math`;python`math.sqrt(9)`; let list = 3 4 2 1;python`sorted()`; python;
var python = pythonBridge(options)
Spawns a Python interpreter, exposing a bridge to the running processing. Configurable via options
.
options.python
- Python interpreter, defaults topython
Also inherits the following from child_process.spawn([options])
.
options.cwd
- String Current working directory of the child processoptions.env
- Object Environment key-value pairsoptions.stdio
- Array Child's stdio configuration. Defaults to['pipe', process.stdout, process.stderr]
options.uid
- Number Sets the user identity of the process.options.gid
- Number Sets the group identity of the process.
var python = ;
`expression(args...)`
.then(...)
pythonEvaluates Python code, returning the value back to Node.
// Interpolates arguments using JSON serialization.python`sorted()`; // Passing key-value argumentslet obj = hello: 'world' foo: 'bar';python`dict(baz=123, **)`;
`statement`
.then(...)
python.exExecute Python statements.
let a = 123 b = 321;pythonex` def hello(a, b): return a + b`;python`hello(, )`;
python.lock(...).then(...)
Locks access to the Python interpreter so code can be executed atomically. If possible, it's recommend to define a function in Python to handle atomicity.
python; // Recommended to define function in Pythonpythonex` def atomic(): hello = 123 return hello + 321`;python`atomic()`;
python.stdin, python.stdout, python.stderr
Pipes going into the Python process, separate from execution & evaluation. This can be used to stream data between processes, without buffering.
let Promise = ;let fs = Promise; let fileWriter = fs; pythonstdout; // listen on Python process's stdoutpythonex` import sys for line in sys.stdin: sys.stdout.write(line) sys.stdout.flush()`; // write to Python process's stdinpythonstdin;;
python.end()
Stops accepting new Python commands, and waits for queue to finish then gracefully closes the Python process.
python.disconnect()
Alias to python.end()
python.kill([signal])
Send signal to Python process, same as child_process child.kill
.
let Promise = ; pythonex` from time import sleep sleep(9000)`;
Handling Exceptions
We can use Bluebird's promise.catch(...)
catch handler in combination with Python's typed Exceptions to make exception handling easy.
python.Exception
Catch any raised Python exception.
pythonex` hello = 123 print(hello + world) world = 321`;
python.isException(name)
Catch a Python exception matching the passed name.
{ return python` / ` ;};
pythonBridge.PythonException
Alias to python.Exception
, this is useful if you want to import the function to at the root of the module.
pythonBridge.isPythonException
Alias to python.isException
, this is useful if you want to import the function to at the root of the module.
Features
- Does not affect Python's stdin, stdout, or stderr pipes.
- Exception stack traces forwarded to Node for easy debugging.
- Python 2 & 3 support, end-to-end tested.
- Windows support, end-to-end tested.
- Command queueing, with promises.
- Long running Python sessions.
- ES6 template tags for easy interpolation & multiline code.
Comparisons
After evaluating of the existing landscape of Python bridges, the following issues are why python-bridge was built.
- python-shell — No promises for queued requests; broken evaluation parser; conflates evaluation and stdout; complex configuration.
- python — Broken evaluation parsing; no exception handling; conflates evaluation, stdout, and stderr.
- node-python — Complects execution protocol with incomplete Python embedded DSL.
- python-runner — No long running sessions;
child_process.spawn
wrapper with unintuitive API; no serialization. - python.js — Embeds specific version of CPython; requires compiler and CPython dev packages; incomplete Python embedded DSL.
- cpython — Complects execution protocol with incomplete Python embedded DSL.
- eval.py — Can only evaluate single line expressions.
- py.js — For setting up virtualenvs only.
License
MIT