odoorun is a portable command-line launcher and inspection tool for Odoo
development projects. It discovers the appropriate Odoo executable, prepares
addon paths, forwards ordinary Odoo options, completes database and module
names, and provides read-only database/addon inspection commands.
No symlink, alias, or machine-specific path is required. Run
odoorun completion install once to enable Bash auto-completion.
- Run a project-local
odoo-bin, a linked-venvodoo, orodooonPATH. - Prefer
odoofrom the virtual environment active in the current terminal. - Run from a project root or any nested directory.
- Configure standard and custom addon paths automatically.
- Complete PostgreSQL database names after
-d/--database. - Complete module names after
-u/--updateand-i/--init. - Complete odoorun commands, options, and fixed option values.
- List Odoo databases and detect their versions.
- List core/custom addon manifests and optionally show database module state.
- Forward Odoo 19 native module and database management commands.
- Produce human-readable tables, tab-separated text, or JSON.
- Python 3.10 or newer.
psqlfor database completion,db list, and database-awareaddon list.
Launching Odoo and listing addons from the filesystem do not require psql.
Install the published package as an isolated command:
uv tool install odoorunOr install with pip:
python -m pip install odoorunInstall the latest source directly from GitHub:
uv tool install git+https://github.com/khalid99io/odoorun.gitInstall or refresh a local development checkout:
uv tool install --force .Run Odoo with ordinary Odoo options:
odoorun -d my_database --dev=all
odoorun -d my_database -u sale_managementAdd custom directories to an Odoo source checkout. Relative -a paths are
resolved from the checkout's parent directory:
odoorun -a custom-addons,enterprise -d my_databaseUse Odoo's native addon preference unchanged:
odoorun --addons-path="addons,custom-addons" -d my_databaseUse native Odoo 19 module and database commands:
odoorun module uninstall -d my_database obsolete_module
odoorun module upgrade -d my_database sale stock
odoorun db dump my_database backup.zipThe short o command is optional. If you configure alias o=odoorun, the
examples below can use o; otherwise use odoorun directly.
odoorun selects the first available executor in this order:
- An executable
odoo-binin the current directory or a parent directory. - The
odooexecutable inside the virtual environment currently active in the terminal throughVIRTUAL_ENV. - An Odoo executor in the linked or configured project venv, such as
~/venvs/<project>/bin/odoo. - An
odoocommand available onPATH.
When a virtual environment is active, odoorun reads VIRTUAL_ENV and checks
that environment directly. Its location and name do not need to match the
project directory, and it takes precedence over convention-based lookup.
For source checkouts, the built-in addons directory is passed automatically.
For linked-venv projects, --addons-path=odoo/addons is added unless the user
provides --addons, --addons-path, or an equivalent value explicitly.
The convention-based lookup remains as a backward-compatible fallback when no suitable active environment is found. If the project and fallback venv names differ, configure it with:
export ODOORUN_VENV_NAME=my-project-venv
export ODOORUN_VENV_ROOT="$HOME/venvs"odoorun invokes the selected venv executable directly. Activating a venv makes
that exact environment the preferred choice; without one, configured discovery
and PATH remain available. A child process cannot alter the parent shell
prompt, so prompt decoration remains a shell responsibility.
Arguments outside odoorun's inspection/setup commands are forwarded to the discovered Odoo executable. This includes Odoo 19's native module commands:
odoorun module install -d my_database module_a module_b
odoorun module upgrade -d my_database module_a module_b
odoorun module uninstall -d my_database module_a module_bCaution
Uninstalling an Odoo module can delete its records and may uninstall dependent modules. Test against a duplicated database and create a backup before running the command on important data.
It also includes Odoo 19's native database operations:
odoorun db init my_database
odoorun db dump my_database backup.zip
odoorun db load restored_database backup.zip
odoorun db duplicate source_database target_database
odoorun db rename old_name new_name
odoorun db drop my_databaseodoorun db list remains odoorun's richer read-only inspection command.
Every other db subcommand is delegated to Odoo. Native command availability
and exact options therefore depend on the discovered Odoo version.
odoorun [ODOO_OPTIONS]
Arguments whose first item is not an odoorun tool command are passed to the
discovered Odoo executable. The -a option is odoorun's source-checkout
convenience and is converted into the effective native --addons-path.
odoorun doctor
Displays the working directory, active virtual environment, discovered Odoo
executable, and whether psql is available. It does not modify the project or
start Odoo.
odoorun completion [bash|install]
bashprints the generated Bash integration script.installidempotently addssource <(odoorun completion bash)to~/.bashrc.
Run the installer once and open a new Bash terminal:
odoorun completion installCommand and option completion is available for odoorun and o:
o d<Tab> # db, doctor
o db <Tab> # list, init, dump, load, duplicate, rename, drop
o addon list --s<Tab> # --source, --state
o addon list --source c<Tab> # core, custom
o addon list --state in<Tab> # installed
o db list --format j<Tab> # json
o module un<Tab> # uninstall
o module uninstall -d demo sale_<Tab>
o module force-demo -d demo sale_<Tab>Database and module completion is also registered for direct Odoo commands:
odoo, odoo-bin, and ./odoo-bin.
Database examples:
o -d demo<Tab>
odoorun --database=demo<Tab>Module examples, including comma-separated values:
o -d my_database -u sale_m<Tab>,bas<Tab>
o -d my_database -i custom_m<Tab>Database completion uses psql and respects PostgreSQL environment variables
such as PGHOST, PGPORT, PGUSER, PGDATABASE, and PGPASSWORD. Module
completion finds directories containing __manifest__.py or __openerp__.py
in source, project, explicit, and linked-venv addon roots.
odoorun db list [OPTIONS]
Options:
--odoo-version VERSION: keep Odoo databases whose installedbasemodule version starts withVERSION, such as19or19.0.--all: include regular PostgreSQL and inaccessible databases.--format table|plain|json: select the output format; default istable.--no-header: hide headings in table/plain output.
Examples:
odoorun db list
odoorun db list --odoo-version 19
odoorun db list --all --format jsonBy default, only databases recognized as Odoo databases are shown. Detection
uses ir_module_module, and the displayed Odoo version comes from the installed
base module.
odoorun addon list [OPTIONS]
Options:
-d, --database DATABASE: queryir_module_moduleand annotate filesystem addons with their state/version in that database.--source all|core|custom: filter by addon-root origin.--state all|installed|uninstalled|upgrade: filter by database state; non-allvalues require-d.--installed: shortcut for--state installed; requires-d.--custom: shortcut for--source custom.--core: shortcut for--source core.--addons-path PATHS: override discovery with a native comma-separated Odoo addon path.-a PATHS: add comma-separated custom directories to source-checkout discovery.--format table|plain|json: select the output format; default istable.--no-header: hide headings in table/plain output.
Examples:
odoorun addon list
odoorun addon list --source core
odoorun addon list --custom
odoorun addon list -d my_database
odoorun addon list -d my_database --installed --custom
odoorun addon list --addons-path="addons,../enterprise"Addon discovery always starts from filesystem directories. Supplying -d
does not search addons inside a database; it only adds database state/version
information and enables state filtering.
Print the installed odoorun version and exit:
odoorun --versionEvery tool command has focused help:
odoorun completion --help
odoorun db list --help
odoorun addon list --helpDatabase features execute read-only queries through psql. Standard libpq
configuration is respected, including environment variables, service files,
and .pgpass. Passwords are not accepted as odoorun command-line options.
The launcher is intentionally decoupled from Odoo's Python package: odoorun discovers and invokes the target project's executable rather than importing Odoo itself. This allows the tool to run source checkouts and virtual environments independently of the Python environment where odoorun is installed.
| Capability | Availability |
|---|---|
| Odoo executable and addon-path discovery | Version-independent |
| Odoo argument passthrough | Version-independent |
doctor, completion, db list, addon list |
Provided by odoorun |
Native module and extended db subcommands |
Odoo 19 or newer |
Install development dependencies and run the full local checks:
uv sync --extra dev
uv run ruff format --check src tests
uv run ruff check src tests
uv run python -m unittest discover -s tests -v
uv run python -m compileall -q src tests
uv buildThe GitHub CI workflow lints, tests, compiles, and builds the project. The test matrix covers Python 3.10 through 3.14.
See CONTRIBUTING.md for the development workflow and CHANGELOG.md for release history.
odoorun is released under the MIT License. The source repository is:
https://github.com/khalid99io/odoorun
PyPI releases use the GitHub Actions Trusted Publisher workflow. Before a new
release, update the version in pyproject.toml, verify CI, and push a matching
version tag.