--- /dev/null
+.. _python_console_page:
+
+******************
+Python Console
+******************
+
+**Python console** - Window for Python interpreter. This window functions like a standard document:
+the pop-up menu invoked by right-click in this window gives access to **Copy/Paste/SelectAll/ClearAll** options.
+
+You can run a Python script in interactive mode by typing expressions line by line or by loading a Python file
+from the main menu **File -> Load Script**.
+
+==================
+Asynchronous mode
+==================
+
+By default the console is always initialized in asynchronous mode when the Python commands are executed in the separated thread
+that does not block the main GUI loop. So, you'll see any intermediate output from the running script even if the script didn't finish yet.
+
+In the synchronous mode each Python command is executed in the main GUI thread, then GUI is blocked until the command is finished.
+It could be an issue if you run a time consuming Python script, because you won't see any output till the end of execution.
+
+If you need to run a script in synchronous mode for whatever reason, set ``PYTHON_CONSOLE_SYNC`` environment variable before Salome start:
+
+.. code-block:: console
+
+ export PYTHON_CONSOLE_SYNC=1
+
+==================
+Tracing
+==================
+
+To output in console currently executed functions, we're adding tracing code to the start and at the end
+of the command to deactivate it immediately after execution.
+
+This mechanism is turned off by default. Set ``PYCONSOLE_TRACE`` before SALOME start to activate it:
+
+.. code-block:: console
+
+ export PYCONSOLE_TRACE=1
+
+If the tracing is on while the script is running we can see functions enter and return calls
+with ``>>`` and ``<<`` marks followed by line number and function name. Tracing function prints only calls to functions
+defined in the current script to prevent printing of thousands of lines for builtin functions in some cases.
+
+Example of a script with defined functions:
+
+.. code-block:: python
+ :linenos:
+
+ #!/usr/bin/env python
+
+ import time
+
+ def sum(x, y):
+ time.sleep(3)
+ return x + y
+
+ def sub(x, y):
+ time.sleep(3)
+ return x - y
+
+ def prod(x, y):
+ time.sleep(3)
+ return x * y
+
+ def div(x, y):
+ time.sleep(3)
+ return x / y
+
+ x = 5
+ y = 2
+
+ sum(x, y)
+ sub(x, y)
+ prod(x, y)
+ div(x, y)
+
+And output in the Python console:
+
+.. code-block:: console
+
+ >>> sys.setprofile(lambda frame, event, arg: print('>>', frame.f_lineno, ': ', frame.f_code.co_name) if event == 'call' and frame.f_code.co_filename == '/home/function_calls.py' and frame.f_code.co_name != '<module>' else print('<<', frame.f_lineno, ': ', frame.f_code.co_name) if event == 'return' and frame.f_code.co_filename == '/home/function_calls.py' and frame.f_code.co_name != '<module>' else None); exec(compile(open('/home/function_calls.py', 'rb').read(), '/home/function_calls.py', 'exec')); sys.setprofile(None);
+ >> 5 : sum
+ << 7 : sum
+ >> 9 : sub
+ << 11 : sub
+ >> 13 : prod
+ << 15 : prod
+ >> 17 : div
+ << 19 : div
+ >>>
+