picon runs your code in python interactive console from the command line.
Besides other purposes, it can be easily integrated to your editor to create a live worksheet environment.
This is useful to evaluate your code on the fly and show you the result right below the code within your editor:
You can install
picon as a python package using
pip install picon
Or you can download it from github and put it somewhere in
curl https://raw.githubusercontent.com/gokcehan/picon/master/picon/picon.py -o picon chmod +x picon mkdir -p ~/.local/bin mv picon ~/.local/bin
picon is implemented as a thin wrapper around code module to be used as a command line application.
There are three running modes available in
Following example code is used for demonstration:
$ cat demo.py 'hello world' x = 42 x print(x) y total = 0 for i in range(1000): if i % 3 == 0 or i % 5 == 0: total += i total
Default mode evaluates the code and only shows the output.
This is similar to running your code with
python but it uses interactive console semantics (see syntax section below):
$ picon demo.py 'hello world' 42 42 Traceback (most recent call last): File "<console>", line 1, in <module> NameError: name 'y' is not defined 233168
Live mode shows the code and the output as in a live session. This can be used to prepare programming notes or documentation:
$ picon demo.py -l >>> 'hello world' 'hello world' >>> >>> x = 42 >>> x 42 >>> print(x) 42 >>> >>> y Traceback (most recent call last): File "<console>", line 1, in <module> NameError: name 'y' is not defined >>> >>> total = 0 >>> for i in range(1000): ... if i % 3 == 0 or i % 5 == 0: ... total += i ... >>> total 233168
Append mode appends the output as comments below the code.
A pipe character (
|) is added to differentiate these comments from regular ones and strip them in consequent executions.
This mode is designed to be integrated to editors to create a live worksheet environment:
$ picon demo.py -a 'hello world' #|'hello world' x = 42 x #|42 print(x) #|42 y #|Traceback (most recent call last): #| File "<console>", line 1, in <module> #|NameError: name 'y' is not defined total = 0 for i in range(1000): if i % 3 == 0 or i % 5 == 0: total += i total #|233168
Syntax of python interactive console differs from regular python in two main aspects.
First, return values are automatically shown without a
$ cat return.py x = 42 x print(x) $ python return.py 42 $ picon return.py 42 42
Second, blocks are separated with blank newlines in addition to indentation:
$ cat block.py if True: print('one') print('two') $ python block.py one two $ picon block.py one File "<console>", line 1 print('two') ^ IndentationError: unexpected indent
Having blank trailing spaces equal to the indentation works in interactive console but not in
:%!picon -a evaluates the buffer content and puts the output as comments below the code.
In order to keep the cursor position fixed and join undo operations to a single step you can use a command similar to the following:
command! Picon exe 'normal m`' | silent! undojoin | exe '%!picon -a' | exe 'normal ``'
You may want to assign this command to either
BufWritePre event to run on save and/or
CursorHold event to run on idle as follows (see also
autocmd Filetype python autocmd BufWritePre <buffer> Picon autocmd Filetype python autocmd CursorHold <buffer> Picon