# Getting Started with Python

  NOTE: Iree's Python API is currently being reworked. Some of these
  instructions may be in a state of flux as they document the end state.

The IREE compiler API is called `iree.compiler`.

There are additional ancillary modules that are not part of the public API.

Note this guide does not cover IREE integrations with other frontends, such as
TensorFlow. For those, see the relevant
[getting started guides](../get-started).

## Prerequisites

You should already have IREE cloned and building on your machine. See the other
[getting started guides](../get-started) for instructions.

> Note:<br>
> &nbsp;&nbsp;&nbsp;&nbsp;Support is only complete with CMake.

Minimally, the following CMake flags must be specified:

* `-DIREE_BUILD_PYTHON_BINDINGS=ON`

## Python Setup

Install [Python 3](https://www.python.org/downloads/) `>= 3.6` and
[pip](https://pip.pypa.io/en/stable/installing/), if needed.

> Note:<br>
> &nbsp;&nbsp;&nbsp;&nbsp;If using `pyenv` (or an interpreter manager that
  depends on it like `asdf`), you'll need to use
  [`--enable-shared`](https://github.com/pyenv/pyenv/tree/master/plugins/python-build#building-with---enable-shared)
  during interpreter installation.

(Recommended) Setup a virtual environment with `venv` (or your preferred
mechanism):

```shell
# Note that venv is only available in python3 and is therefore a good check
# that you are in fact running a python3 binary.
$ python -m venv .venv
$ source .venv/bin/activate
# When done: run 'deactivate'
```

As we distribute `manylinux2014` binaries, your pip version should be listed as
supported on the compatibility table at https://github.com/pypa/manylinux. As
needed, you can upgrade pip using:

```shell
$ python -m pip install --upgrade pip
```

Install packages:

```shell
$ python -m pip install numpy absl-py
```

## Building

From the *parent* directory of the IREE git repository clone, create and enter a
build directory, such as:

```shell
$ mkdir iree-build
$ cd iree-build
```

Then build like this:

```shell
$ cmake ../iree -G Ninja \
    -DCMAKE_C_COMPILER=clang \
    -DCMAKE_CXX_COMPILER=clang++ \
    -DIREE_BUILD_PYTHON_BINDINGS=ON  .
$ cmake --build .
```

## Running Python Tests

We continue to assume that we are in the build directory where we made the build
in the previous section.

To run tests for core Python bindings built with CMake:

```shell
$ ctest -L bindings/python
```
## Using Colab

There are some sample colabs in the `colab` folder. If you have built the
project with CMake/ninja and set your `PYTHONPATH` to the `bindings/python`
directory in the build dir (or installed per below), you should be able to
start a kernel by following the stock instructions at
https://colab.research.google.com/ .

## Installing and Packaging

There is a `setup.py` in the `bindings/python` directory under the build dir.
To install into your (hopefully isolated) virtual env:

```shell
# See the above note about python3, and the above step setting PYTHONPATH.
python bindings/python/setup.py install
```

To create wheels (platform dependent and locked to your Python version
without further config):

```shell
python bindings/python/setup.py bdist_wheel
```

Note that it is often helpful to differentiate between the environment used to
build and the one used to install. While this is just "normal" python
knowledge, here is an incantation to do so:

```shell
# From parent/build environment.
python -m pip freeze > /tmp/requirements.txt
deactivate  # If already in an environment

# Enter new scratch environment.
python -m venv ./.venv-scratch
source ./.venv-scratch/bin/activate
python -m pip install -r /tmp/requirements.txt

# Install IREE into the new environment.
python bindings/python/setup.py install
```
