[docs] Add shebang section for scripts#11553
Conversation
|
CI now passes :) |
|
While these changes are now formally correct, they are unfortunately factually incorrect. The proper shebang line should be The use of the
The use of the Moreover, if the latter flag is used, the extension of the script can be chosen arbitrarily, or even omitted; it does not have to be |
|
@c14n Thanks for taking the time, I've incorporated your feedback |
|
Notice that I am not a maintainer, so the following are just the observations of some random passer-by. There are still some issues with this pull request, chief of which being that the changes do not mesh well with the surrounding material. This is due to the fact that you do not adhere to the style guide, and do not try to match the structure of the surrounding material. Notice how every section on this page of the documentation adheres to this pattern: Do you see how focused and concise that approach is? My advice: Read the style guide and try to match the form of the existing material. (This also applies to commit messages.) There are also some issues with the contents of the patch. I'll add inline comments to point those out. |
docs/guides/scripts.md
Outdated
|
|
||
| ``` | ||
| chmod +x do-thing | ||
| ``` |
There was a problem hiding this comment.
Does this need to be explained this explicitly? According to the style guide, guides
May assume basic knowledge of the domain.
so it should be enough to mention that a script should have its execute bit set in the introduction.
There was a problem hiding this comment.
How about this for an introductory paragraph:
On Unix-like systems, you can turn your script into a standalone executable by setting its execute
bit with `chmod +x standalone.py` and adding a shebang interpreter directive at the start of your
script:
```python title="standalone.py"
#!/usr/bin/env -S uv run --script
print("Hello, standalone!")
```
|
|
|
Seeing that FreeBSD, coreutils, and OS X have supported for Moreover, the style guide indicates that guides
and in particular
So I don't think this needs to be mentioned. |
|
I think those points in the style guide don't seem entirely relevant here given the entire point it using env is portability between systems. If anything, While I am glad
I think it would be best to consider some addition to uv which makes it possible to not need -S. (e.g. a uv-run symlink) In the meanwhile I feel like the docs should, when recommending an approach to solving a portability problem (which this is), at least mention in passing that the solution is itself non-portable. |
|
It seems dubious that we'll introduce another entry point to uv specifically for shebangs. I think it's reasonable for the guide to focus on major platforms, i.e., Ubuntu, macOS, Windows. It's also fine to say that before the example. Is there a viable alternative on those distributions? Long-term, we need to split some of the scripts guide into a concept document so we can cover things like this in-depth without adding complexity for beginners. |
|
Regarding alternatives for different operating systems and linux environments that don't use GNU coreutils and would also work on systems with coreutils: You can put a script in your path, called #!/bin/sh
exec uv run --script "$@"Then you can use this from a shebang like I would also agree that this alternative requires too much explanation to be documented by these docs. But, if the argument is that these kinds of details are too much for these "beginner" oriented docs then I question if it's even appropriate to document the solution in this PR either. The selling point of this style of script which has been made when presenting uv as useful in this context (as something which can be executed from the shebang) is that you can put this at the top of a shell script and distribute the shell script across various people or contexts and that it will just work. But the reality is that there are caveats like I outlined above. You can say that OpenBSD, NetBSD, and Solaris are niche use-cases and I agree for the most part but a lot of people do use containers and are likely to run into the And at the end of the day, regardless of what direction the project wants to take on this topic or this PR, all I was hoping for with my first comment was some note either at the top or the bottom to say: "Note: |
|
Thanks for the thorough response, appreciate it. |
|
I choose to believe that users can generally be trusted to consult the page «Using uv in Docker» rather than «Running scripts» when attempting to containerize their software. Therefore, I think it's appropriate to restrict the guidance provided on the latter page to the use cases that do not involve containerization. I also think that the official docs should only provide guidance on how to use the software for platforms for which they also provide installation instructions. At time of writing, the Unix-likes that are supported in that sense are only macOS and Linux, both of which support The introduction of a wrapper script to facilitate running scripts on platforms that fail to implement Personally, I doubt that the introduction of such a wrapper is particularily useful for containerization, seeing that adding one to your image is a four-liner: COPY --chmod=755 <<EOF /usr/bin/envess
#!/bin/sh
exec uv run --script "$@"
EOFFinally, guides should strive to provide solutions. Even if it were a good idea to include documentation for unsupported platforms, I would object to a note that reads
How does that help the reader of the guide accomplish their goal, should they be on a system that does not support that flag? (Also FreeBSD introduced |
Containerising software is not the situation I was thinking of when I suggested people would run into this limitation of
I came across the docs without ever seeing or reading the installation section. I think it's likely people will come across the page on using uv in scripts directly from search engines (which is how I came across the documentation for
I was answering a question, I explicitly said I wasn't suggesting it be included in any part of these docs. But worth clarifying that I wasn't thinking of dockerfiles as the main case where people would encounter this issue. More-so any situation where one might either enter the container to run a one-off script. The obvious workaround is to just do
I was mainly trying to keep it short, and I didn't realise it originated in FreeBSD but I can see that you are in fact right. So maybe it's best to just say it's a common extension which is not supported on all environments. Either way, yes, guides should guide people to solutions but it's also important for guides to be up-front about the limitations of the solutions. In this case it's easy to assume, especially given the surrounding wording, that if you use |
|
I'll try to get this in this week. |
|
I also come here to say that please embrace the uv shebang. This is currently the best way to work with Python scripts, yet it's totally unofficial / you have to ask on Discord level hidden. I recommend the following:
Also, please don't limit the 99.999% of developers's use case, just because there is an incompatibility with Busybox, Toybox, OpenBSD, NetBSD or Solaris. Those users with exotic environments can use any other shebang line, the important thing would be to make development experience smooth for the majority of users. |
|
CI failing looks unrelated |
|
Could someone please retrigger the CI pipeline? My PR has nothing to do with the GraalPy error |
|
Thanks for your patience here! |
|
Thanks for merging this. I just wanted to ask one Q: the other day I run into that if I make a project with I mean the ones where I put init.py and utility functions, etc. I use this in pyproj: So for the script files in projects it has to be without --script. For the script files outside of projects, like self-contained ones with these scripts absolutely need Either this needs to be fixed in uv, or the documentation should mention this. Of course, it'd be best if we could get rid of --script altogether. |
|
|
|
Ah I see
I can add a note about that. |
|
I don't know if this is true? in a project which has |
|
I mean importing from my own utility library. But I tried it today and I cannot reproduce it, but yesterday I run into it. |
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [astral-sh/uv](https://github.com/astral-sh/uv) | patch | `0.6.11` -> `0.6.16` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>astral-sh/uv (astral-sh/uv)</summary> ### [`v0.6.16`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0616) [Compare Source](astral-sh/uv@0.6.15...0.6.16) ##### Bug fixes - Revert "Properly handle authentication for 302 redirect URLs" ([#​13041](astral-sh/uv#13041)) ### [`v0.6.15`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0615) [Compare Source](astral-sh/uv@0.6.14...0.6.15) This release includes preliminary support for the `pylock.toml` file format, as standardized in [PEP 751](https://peps.python.org/pep-0751/). `pylock.toml` is an alternative resolution output format intended to replace `requirements.txt` (e.g., in the context of `uv pip compile`, whereby a "locked" `requirements.txt` file is generated from a set of input requirements). `pylock.toml` is standardized and tool-agnostic, such that in the future, `pylock.toml` files generated by uv could be installed by other tools, and vice versa. As of this release, `pylock.toml` is supported in the following commands: - To export a `uv.lock` to the `pylock.toml` format, run: `uv export -o pylock.toml` - To generate a `pylock.toml` file from a set of requirements, run: `uv pip compile -o pylock.toml -r requirements.in` - To install from a `pylock.toml` file, run: `uv pip sync pylock.toml` or `uv pip install -r pylock.toml` ##### Enhancements - Add PEP 751 support to `uv pip compile` ([#​13019](astral-sh/uv#13019)) - Add `uv export` support for PEP 751 ([#​12955](astral-sh/uv#12955)) - Accept `requirements.txt` (verbatim) as a format on the CLI ([#​12957](astral-sh/uv#12957)) - Add `UV_NO_EDITABLE` environment variable to set `--no-editable` on all invocations ([#​12773](astral-sh/uv#12773)) - Add `pylock.toml` to `uv pip install` and `uv pip sync` ([#​12992](astral-sh/uv#12992)) - Add a brief sleep before sending `SIGINT` to child processes ([#​13018](astral-sh/uv#13018)) - Add upload time to `uv.lock` ([#​12968](astral-sh/uv#12968)) - Allow updating Git sources by name ([#​12897](astral-sh/uv#12897)) - Cache `which git` in `uv init` ([#​12893](astral-sh/uv#12893)) - Enable `--dry-run` with `--locked` / `--frozen` for `uv sync` ([#​12778](astral-sh/uv#12778)) - Infer output type in `uv export` ([#​12958](astral-sh/uv#12958)) - Make `uv init` resilient against broken git ([#​12895](astral-sh/uv#12895)) - Respect build constraints for `uv run --with` dependencies ([#​12882](astral-sh/uv#12882)) - Split UV_INDEX on all whitespace ([#​12820](astral-sh/uv#12820)) - Support build constraints in `uv tool` and PEP723 scripts. ([#​12842](astral-sh/uv#12842)) - Use suffix from `uvx` binary when searching for uv binary ([#​12923](astral-sh/uv#12923)) - Update version formatting to use cyan color ([#​12943](astral-sh/uv#12943)) - Add debug logs for version file search ([#​12951](astral-sh/uv#12951)) - Fix `SourceNotAllowed` error message during Python discovery ([#​13012](astral-sh/uv#13012)) - Obfuscate password in credentials debug messages ([#​12944](astral-sh/uv#12944)) - Obfuscate possible tokens in URL logs ([#​12969](astral-sh/uv#12969)) - Validate that PEP 751 entries don't include multiple sources ([#​12993](astral-sh/uv#12993)) ##### Preview features - Build backend: Add reference docs and schema ([#​12803](astral-sh/uv#12803)) ##### Bug fixes - Align supported `config-settings` with example in docs ([#​12947](astral-sh/uv#12947)) - Ensure virtual environment is compatible with interpreter on sync ([#​12884](astral-sh/uv#12884)) - Fix `PythonDownloadRequest` parsing for partial keys ([#​12925](astral-sh/uv#12925)) - Fix pre-release exclusive comparison operator in `uv-pep440` ([#​12836](astral-sh/uv#12836)) - Forward additional signals to the child process in `uv run` ([#​13017](astral-sh/uv#13017)) - Omit PEP 751 version for source trees ([#​13030](astral-sh/uv#13030)) - Patch `CC` and `CCX` entries in sysconfig for cross-compiled `aarch64` Python distributions ([#​12239](astral-sh/uv#12239)) - Properly handle authentication for HTTP 302 redirect URLs ([#​12920](astral-sh/uv#12920)) - Set 4MB stack size for all threads, introduce `UV_STACK_SIZE` ([#​12839](astral-sh/uv#12839)) - Show PyPy downloads during `uv python list` ([#​12915](astral-sh/uv#12915)) - Add `subdirectory` to Direct URL for local directories ([#​12971](astral-sh/uv#12971)) - Prefer stable releases over pre-releases in `uv python install` ([#​12194](astral-sh/uv#12194)) - Write requested Python variant to pin file in `uv init` ([#​12870](astral-sh/uv#12870)) ##### Documentation - Fix CLI reference with code block ([#​12807](astral-sh/uv#12807)) - Fix lockfile note ([#​12793](astral-sh/uv#12793)) - Fix typo in a reference ([#​12858](astral-sh/uv#12858)) - Improve docs for `uv python list --only-downloads` and `--only-installed` ([#​12916](astral-sh/uv#12916)) - Update note on lack of musl distributions to ARM-only ([#​12825](astral-sh/uv#12825)) - Add section on shebangs for scripts ([#​11553](astral-sh/uv#11553)) - Display aliases for long and short args in the CLI reference ([#​12824](astral-sh/uv#12824)) - Fix highlight line in explicit index documentation ([#​12887](astral-sh/uv#12887)) - Add explicit source (matching PyTorch guide) ([#​12844](astral-sh/uv#12844)) - Fix link to issue ([#​12823](astral-sh/uv#12823)) - Fix grammatical error in FastAPI guide ([#​12908](astral-sh/uv#12908)) - Add `--locked` to `uv sync` in GitHub Actions guide ([#​12819](astral-sh/uv#12819)) - Improve formatting for `"all"` `default-groups` setting documentation ([#​12963](astral-sh/uv#12963)) - Replace `--frozen` with `--locked` in Docker integration guide ([#​12818](astral-sh/uv#12818)) ### [`v0.6.14`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0614) [Compare Source](astral-sh/uv@0.6.13...0.6.14) ##### Python versions The following Python versions have been added: - CPython 3.13.3 - CPython 3.12.10 - CPython 3.11.12 - CPython 3.10.17 - CPython 3.9.22 See the [`python-build-standalone` release notes](https://github.com/astral-sh/python-build-standalone/releases/tag/20250409) for more details. ##### Enhancements - Add `uv-build` and `uv_build` aliases to `uv init --build-backend` ([#​12776](astral-sh/uv#12776)) - Emit dedicated error message for Conda `environment.yml` files ([#​12669](astral-sh/uv#12669)) ##### Preview features - Build backend: Check module dir exists for sdist build ([#​12779](astral-sh/uv#12779)) - Build backend: Fix sdist with long directories ([#​12764](astral-sh/uv#12764)) ##### Performance - Avoid querying GitHub on repeated install invocations ([#​12767](astral-sh/uv#12767)) ##### Bug fixes - Error when `tool.uv.sources` is set in system-level configuration file ([#​12757](astral-sh/uv#12757)) - Split workspace members onto their own lines in `uv init` ([#​12756](astral-sh/uv#12756)) ##### Documentation - Add lockfile note about PEP 751 ([#​12732](astral-sh/uv#12732)) - Extend the reference documentation for `uv pip sync` ([#​12683](astral-sh/uv#12683)) - Fix mismatched pip interface header / nav titles ([#​12640](astral-sh/uv#12640)) ### [`v0.6.13`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0613) [Compare Source](astral-sh/uv@0.6.12...0.6.13) ##### Enhancements - Add `--show-version` to `uv python find` ([#​12376](astral-sh/uv#12376)) - Remove `--no-config` warning from `uv pip compile` and `uv pip sync` ([#​12642](astral-sh/uv#12642)) - Skip repeated directories in `PATH` when searching for Python interpreters ([#​12367](astral-sh/uv#12367)) - Unset `SCRIPT_PATH` in relocatable activation script ([#​12672](astral-sh/uv#12672)) - Add `UV_PYTHON_DOWNLOADS_JSON_URL` to set custom managed python sources ([#​10939](astral-sh/uv#10939)) - Reject `pyproject.toml` files in `uv pip compile -o` ([#​12673](astral-sh/uv#12673)) - Respect the `--offline` flag for Git operations ([#​12619](astral-sh/uv#12619)) ##### Bug fixes - Warn instead of error if CRC appears to be missing ([#​12722](astral-sh/uv#12722)) - Avoid infinite loop in `uv export` with conflicts ([#​12726](astral-sh/uv#12726)) ##### Rust API - Update MSRV to 1.84 ([#​12670](astral-sh/uv#12670)) ### [`v0.6.12`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0612) [Compare Source](astral-sh/uv@0.6.11...0.6.12) ##### Enhancements - Report the queried executable path in `uv python list` ([#​12628](astral-sh/uv#12628)) - Improve archive unpack error messages ([#​12627](astral-sh/uv#12627)) ##### Bug fixes - Respect `authenticate` when using `explicit = true` ([#​12631](astral-sh/uv#12631)) - Normalize extra and group names in `uv add` and `uv remove` ([#​12586](astral-sh/uv#12586)) - Enforce CRC-32 checks when unpacking archives ([#​12623](astral-sh/uv#12623)) - Fix parsing of `python-platform` in settings files ([#​12592](astral-sh/uv#12592)) ##### Documentation - Add note about `uv build` to `package = false` ([#​12608](astral-sh/uv#12608)) - Add index fallback note to `authenticate = always` documentation ([#​12498](astral-sh/uv#12498)) - Fix invalid 'kind' reference in flat index docs ([#​12583](astral-sh/uv#12583)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4yNTEuMCIsInVwZGF0ZWRJblZlciI6IjM5LjI1My41IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
## 0.6.17 ### Preview features - Add PyTorch v2.7.0 to GPU backend ([#13072](astral-sh/uv#13072)) ### Bug fixes - Avoid panic for invalid Python versions ([#13077](astral-sh/uv#13077)) - Block scripts from overwriting `python` ([#13051](astral-sh/uv#13051)) - Check distribution names to handle invalid redirects ([#12917](astral-sh/uv#12917)) - Check for mismatched package and distribution names on resolver thread ([#13088](astral-sh/uv#13088)) - Fix panic with invalid last character in PEP 508 name ([#13105](astral-sh/uv#13105)) - Reject `requires-python` even if not listed on the index page ([#13086](astral-sh/uv#13086)) ## 0.6.16 ### Bug fixes - Revert "Properly handle authentication for 302 redirect URLs" ([#13041](astral-sh/uv#13041)) ## 0.6.15 This release includes preliminary support for the `pylock.toml` file format, as standardized in [PEP 751](https://peps.python.org/pep-0751/). `pylock.toml` is an alternative resolution output format intended to replace `requirements.txt` (e.g., in the context of `uv pip compile`, whereby a "locked" `requirements.txt` file is generated from a set of input requirements). `pylock.toml` is standardized and tool-agnostic, such that in the future, `pylock.toml` files generated by uv could be installed by other tools, and vice versa. As of this release, `pylock.toml` is supported in the following commands: - To export a `uv.lock` to the `pylock.toml` format, run: `uv export -o pylock.toml` - To generate a `pylock.toml` file from a set of requirements, run: `uv pip compile -o pylock.toml -r requirements.in` - To install from a `pylock.toml` file, run: `uv pip sync pylock.toml` or `uv pip install -r pylock.toml` ### Enhancements - Add PEP 751 support to `uv pip compile` ([#13019](astral-sh/uv#13019)) - Add `uv export` support for PEP 751 ([#12955](astral-sh/uv#12955)) - Accept `requirements.txt` (verbatim) as a format on the CLI ([#12957](astral-sh/uv#12957)) - Add `UV_NO_EDITABLE` environment variable to set `--no-editable` on all invocations ([#12773](astral-sh/uv#12773)) - Add `pylock.toml` to `uv pip install` and `uv pip sync` ([#12992](astral-sh/uv#12992)) - Add a brief sleep before sending `SIGINT` to child processes ([#13018](astral-sh/uv#13018)) - Add upload time to `uv.lock` ([#12968](astral-sh/uv#12968)) - Allow updating Git sources by name ([#12897](astral-sh/uv#12897)) - Cache `which git` in `uv init` ([#12893](astral-sh/uv#12893)) - Enable `--dry-run` with `--locked` / `--frozen` for `uv sync` ([#12778](astral-sh/uv#12778)) - Infer output type in `uv export` ([#12958](astral-sh/uv#12958)) - Make `uv init` resilient against broken git ([#12895](astral-sh/uv#12895)) - Respect build constraints for `uv run --with` dependencies ([#12882](astral-sh/uv#12882)) - Split UV_INDEX on all whitespace ([#12820](astral-sh/uv#12820)) - Support build constraints in `uv tool` and PEP723 scripts. ([#12842](astral-sh/uv#12842)) - Use suffix from `uvx` binary when searching for uv binary ([#12923](astral-sh/uv#12923)) - Update version formatting to use cyan color ([#12943](astral-sh/uv#12943)) - Add debug logs for version file search ([#12951](astral-sh/uv#12951)) - Fix `SourceNotAllowed` error message during Python discovery ([#13012](astral-sh/uv#13012)) - Obfuscate password in credentials debug messages ([#12944](astral-sh/uv#12944)) - Obfuscate possible tokens in URL logs ([#12969](astral-sh/uv#12969)) - Validate that PEP 751 entries don't include multiple sources ([#12993](astral-sh/uv#12993)) ### Preview features - Build backend: Add reference docs and schema ([#12803](astral-sh/uv#12803)) ### Bug fixes - Align supported `config-settings` with example in docs ([#12947](astral-sh/uv#12947)) - Ensure virtual environment is compatible with interpreter on sync ([#12884](astral-sh/uv#12884)) - Fix `PythonDownloadRequest` parsing for partial keys ([#12925](astral-sh/uv#12925)) - Fix pre-release exclusive comparison operator in `uv-pep440` ([#12836](astral-sh/uv#12836)) - Forward additional signals to the child process in `uv run` ([#13017](astral-sh/uv#13017)) - Omit PEP 751 version for source trees ([#13030](astral-sh/uv#13030)) - Patch `CC` and `CCX` entries in sysconfig for cross-compiled `aarch64` Python distributions ([#12239](astral-sh/uv#12239)) - Properly handle authentication for HTTP 302 redirect URLs ([#12920](astral-sh/uv#12920)) - Set 4MB stack size for all threads, introduce `UV_STACK_SIZE` ([#12839](astral-sh/uv#12839)) - Show PyPy downloads during `uv python list` ([#12915](astral-sh/uv#12915)) - Add `subdirectory` to Direct URL for local directories ([#12971](astral-sh/uv#12971)) - Prefer stable releases over pre-releases in `uv python install` ([#12194](astral-sh/uv#12194)) - Write requested Python variant to pin file in `uv init` ([#12870](astral-sh/uv#12870)) ### Documentation - Fix CLI reference with code block ([#12807](astral-sh/uv#12807)) - Fix lockfile note ([#12793](astral-sh/uv#12793)) - Fix typo in a reference ([#12858](astral-sh/uv#12858)) - Improve docs for `uv python list --only-downloads` and `--only-installed` ([#12916](astral-sh/uv#12916)) - Update note on lack of musl distributions to ARM-only ([#12825](astral-sh/uv#12825)) - Add section on shebangs for scripts ([#11553](astral-sh/uv#11553)) - Display aliases for long and short args in the CLI reference ([#12824](astral-sh/uv#12824)) - Fix highlight line in explicit index documentation ([#12887](astral-sh/uv#12887)) - Add explicit source (matching PyTorch guide) ([#12844](astral-sh/uv#12844)) - Fix link to issue ([#12823](astral-sh/uv#12823)) - Fix grammatical error in FastAPI guide ([#12908](astral-sh/uv#12908)) - Add `--locked` to `uv sync` in GitHub Actions guide ([#12819](astral-sh/uv#12819)) - Improve formatting for `"all"` `default-groups` setting documentation ([#12963](astral-sh/uv#12963)) - Replace `--frozen` with `--locked` in Docker integration guide ([#12818](astral-sh/uv#12818))
Summary
Documentation only. Adds a section in scripts.md about running uv scripts with a shebang line
Test Plan
n/a