# Getting started

This document is a simplified guide to help you get started quickly. It provides
a simplified introduction to having a working Python program for both `bzlmod`
and the older way of using `WORKSPACE`.

It assumes you have a `requirements.txt` file with your PyPI dependencies.

For more detailed information about configuring `rules_python`, see:
* [Configuring the runtime](configuring-toolchains)
* [Configuring third-party dependencies (pip/PyPI)](./pypi/index)
* [API docs](api/index)

## Including dependencies

The first step to using `rules_python` is to add the dependency to
your `MODULE.bazel` file:

```starlark
# Update the version "0.0.0" to the release found here:
# https://github.com/bazel-contrib/rules_python/releases.
bazel_dep(name = "rules_python", version = "0.0.0")

pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
pip.parse(
    hub_name = "pypi",
    python_version = "3.11",
    requirements_lock = "//:requirements.txt",
)
use_repo(pip, "pypi")
```

### Using a WORKSPACE file

Using `WORKSPACE` is deprecated but still supported, and it's a bit more involved than
using Bzlmod. Here is a simplified setup to download the prebuilt runtimes.

```starlark
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

# Update the snippet based on the latest release below
# https://github.com/bazel-contrib/rules_python/releases

http_archive(
    name = "rules_python",
    sha256 = "ca77768989a7f311186a29747e3e95c936a41dffac779aff6b443db22290d913",
    strip_prefix = "rules_python-0.36.0",
    url = "https://github.com/bazel-contrib/rules_python/releases/download/0.36.0/rules_python-0.36.0.tar.gz",
)

load("@rules_python//python:repositories.bzl", "py_repositories")

py_repositories()

load("@rules_python//python:repositories.bzl", "python_register_toolchains")

python_register_toolchains(
    name = "python_3_11",
    # Available versions are listed in @rules_python//python:versions.bzl.
    # We recommend using the same version your team is already standardized on.
    python_version = "3.11",
)

load("@rules_python//python:pip.bzl", "pip_parse")

pip_parse(
    name = "pypi",
    python_interpreter_target = "@python_3_11_host//:python",
    requirements_lock = "//:requirements.txt",
)
```

## "Hello World"

Once you've imported the rule set using either Bzlmod or `WORKSPACE`, you can then
load the core rules in your `BUILD` files with the following:

```starlark
load("@rules_python//python:py_binary.bzl", "py_binary")

py_binary(
  name = "main",
  srcs = ["main.py"],
  deps = [
      "@pypi//foo",
      "@pypi//bar",
  ]
)
```
