| # Getting a REPL or Interactive Shell |
| |
| `rules_python` provides a REPL to help with debugging and developing. The goal of |
| the REPL is to present an environment identical to what a {bzl:obj}`py_binary` creates |
| for your code. |
| |
| ## Usage |
| |
| Start the REPL with the following command: |
| ```console |
| $ bazel run @rules_python//python/bin:repl |
| Python 3.11.11 (main, Mar 17 2025, 21:02:09) [Clang 20.1.0 ] on linux |
| Type "help", "copyright", "credits" or "license" for more information. |
| >>> |
| ``` |
| |
| Settings like `//python/config_settings:python_version` will influence the exact |
| behaviour. |
| ```console |
| $ bazel run @rules_python//python/bin:repl --@rules_python//python/config_settings:python_version=3.13 |
| Python 3.13.2 (main, Mar 17 2025, 21:02:54) [Clang 20.1.0 ] on linux |
| Type "help", "copyright", "credits" or "license" for more information. |
| >>> |
| ``` |
| |
| See [//python/config_settings](api/rules_python/python/config_settings/index) |
| and [Environment Variables](environment-variables) for more settings. |
| |
| ## Importing Python targets |
| |
| The `//python/bin:repl_dep` command line flag gives the REPL access to a target |
| that provides the {bzl:obj}`PyInfo` provider. |
| |
| ```console |
| $ bazel run @rules_python//python/bin:repl --@rules_python//python/bin:repl_dep=@rules_python//tools:wheelmaker |
| Python 3.11.11 (main, Mar 17 2025, 21:02:09) [Clang 20.1.0 ] on linux |
| Type "help", "copyright", "credits" or "license" for more information. |
| >>> import tools.wheelmaker |
| >>> |
| ``` |
| |
| ## Customizing the shell |
| |
| By default, the `//python/bin:repl` target will invoke the shell from the `code` |
| module. It's possible to switch to another shell by writing a custom "stub" and |
| pointing the target at the necessary dependencies. |
| |
| ### IPython Example |
| |
| For an IPython shell, create a file as follows. |
| |
| ```python |
| import IPython |
| IPython.start_ipython() |
| ``` |
| |
| Assuming the file is called `ipython_stub.py` and the `pip.parse` hub's name is |
| `my_deps`, set this up in the .bazelrc file: |
| ``` |
| # Allow the REPL stub to import ipython. In this case, @my_deps is the hub name |
| # of the pip.parse() call. |
| build --@rules_python//python/bin:repl_stub_dep=@my_deps//ipython |
| |
| # Point the REPL at the stub created above. |
| build --@rules_python//python/bin:repl_stub=//path/to:ipython_stub.py |
| ``` |