Simple script execution with uv - run Python scripts without explicit --project flag
Project description
Simple Script Execution with uvr
uv is a fast, modern Python package installer and resolver, designed as a drop-in replacement for pip and pip-compile.
Unfortunately, uv
prioritizes virtual environments within the current directory. This makes it cumbersome to execute scripts located elsewhere, requiring the use of the --project flag.
This script offers a streamlined workaround for running Python scripts via uv, allowing you to use uvr [options] script.py instead of uv run [options] --project <script_path> script.py."
Its primary value lies in its simplicity and immediate usability, providing a quick fix for a pressing pain point.
Installation
To install uvr, use the following command:
uv tool install uvr
or
uv tool install --from git+https://github.com/karnigen/uvr uvr
To upgrade uvr, use the following command:
uv tool upgrade uvr
Usage
Several ways to run your Python scripts with uv:
-
Using
uv run --project <script_path> script.py:-
This command explicitly tells
uvto run the specified Python script (script.py) within the context of the project located at<script_path>. -
This is useful when your script relies on dependencies defined within a specific project directory.
-
Example:
uv run [options] --project /path/to/project run_script.py [script_options]
-
-
Using
uvr script.py:-
This is a more direct way to execute your Python script (
run_script.py) usinguvr. -
uvrautomatically determines the project directory based on the script path, effectively mimicking the--projectflag's behavior. -
Example:
uvr [options] [--] run_script.py [script_options]
-
Always use
--if the automatic script identification fails or could be ambiguous.
-
-
Shebang Usage:
-
Example:
#!/usr/bin/env -S uvr [options] [--] # Your Python code here...
-
Note on
-Sflag: The-Sflag allows passing multiple arguments to the interpreter. It is optional if yourenvimplementation supports it (most modern systems do). However:- Without
-S: You can only use#!/usr/bin/env uvrwithout additional options or parameters - With
-S: You can pass options like#!/usr/bin/env -S uvr --with dep1 -- - Some older or minimal Unix-like systems may not support the
-Sflag inenv
- Without
-
Always use
--if the automatic script identification fails or could be ambiguous.
-
-
Scripts without
.pyor.pywextension:-
Automatic
--scriptoption is added if not already present (--scriptor--gui-script) in options. -
Otherwise,
uvmight loop indefinitely. -
Example: For a
fooscript:#!/usr/bin/env -S uvr [options] [--] # Your Python code here...
This will be executed as
uv run [options] --script ...if[options]do not already contain--scriptor--gui-script. -
Or, to be more explicit, you can include the
--scriptflag directly in the shebang:#!/usr/bin/env -S uvr --script(Use
#!/usr/bin/env uvrif-Sis not supported, but then you cannot pass additional options) -
Important Exception for Non-Files: If the identified
script_path(the argument immediately following options or--) does not point to an actual file on disk,uvrwill not automatically add the--scriptor--gui-scriptoption. This behavior ensuresuvrcan correctly pass through commands that are executables within the virtual environment (e.g.,uvr black .,uvr pytest), rather than a Python script file.
-
-
Debug usage:
- Example:
uvr -v [options] [--] run_script.py [script_options] uvr -vv [options] [--] run_script.py [script_options]
- Example:
General Rule for Using the -- Separator
The -- argument functions as a standard command-line delimiter. It explicitly separates options intended for uvr (and its underlying uv process) from arguments specifically designated for the Python script being executed.
Arguments appearing before the -- are processed by uvr (uv). Arguments appearing after the -- are passed directly to the invoked Python script.
This explicit separation is crucial for:
-
Preventing Ambiguity:
uvremploys a basic heuristic to identify the script path (the first non-hyphenated argument). This can lead to misinterpretation if the script itself accepts options that resembleuvr/uvarguments. -
Ensuring Precise Argument Passing: By using
--, users guarantee that all subsequent arguments are correctly delivered to their script, bypassinguvr'sargument parsing logic.
Recommendation: Utilize the -- separator whenever precise control over argument distribution between uvr/uv and the target script is required.
Ctrl+C (SIGINT) Handling
uvr handles KeyboardInterrupt to provide clean CLI behavior when interrupted with Ctrl+C.
- It suppresses Python traceback noise (unwanted junk output) on user interruption.
- It exits with status code
130, following the common Unix convention:128 + 2(SIGINTis signal number2). - This keeps output clean while still signaling to the parent shell/process that execution was interrupted.
Platform note:
- On Linux and macOS,
130matches the common signal-derived convention (128 + SIGINT 2). - On Windows,
130is used intentionally as a consistent, cross-platform interruption code foruvr.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uvr-0.1.25.tar.gz.
File metadata
- Download URL: uvr-0.1.25.tar.gz
- Upload date:
- Size: 6.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.24
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
802f87574865bc085e232be32ac9779558f110708fec7b3dcb4ac18edd728447
|
|
| MD5 |
e26f58bb3f1971a33605742daaaa8f04
|
|
| BLAKE2b-256 |
b79975ab8db51032eaf2a3db6c9c6d437eb439bd6f63de7d3e88829488dd02dc
|
File details
Details for the file uvr-0.1.25-py3-none-any.whl.
File metadata
- Download URL: uvr-0.1.25-py3-none-any.whl
- Upload date:
- Size: 5.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.24
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b75438fa63c63e623be68fa8cb5f1e8752b56e4e0e02696a62cba8a560d6fe9
|
|
| MD5 |
8ac9c02bc3a73b68e45ef9ebce51bfc9
|
|
| BLAKE2b-256 |
60b31bc2d9308423850c3044de01de9b92fe0bef8631e99d0d4045304d726e82
|