4 ms·
This works really well in my experience, but it does mean you need to have a working internet connection the first time you run the script. # /// script #
by simonw 11mo ago
This works really well in my experience, but it does mean you need to have a working internet connection the first time you run the script.
# /// script
# dependencies = [
# "cowsay",
# ]
# ///
import cowsay
cowsay.cow("Hello World")
Then:
uv run cowscript.py
It manages a disposable hidden virtual environment automatically, via a very fast symlink-based caching mechanism.
You can also add a shebang line so you can execute it directly:
#!/usr/bin/env -S uv run --script
#
# /// script
# dependencies = ["cowsay"]
# ///
import cowsay
cowsay.cow("Hello World")
Then:
chmod 755 cowscript
./cowscript
- emidln 11mo agoI wish env -S was more portable. It's a newer feature of the coreutils env implementation and isn't supported elsewhere afaik.
- collinfunk 11mo agoFreeBSD 6.0 added 'env -S'. They have adopted a few different GNU inspired options recently, which I am happy about.
- networked 11mo agoYou can use so-called "exec magic" instead of `env -S`. Here is an explanation with Python examples: https://dbohdan.com/scripts-with-dependencies#exec-magic https://dbohdan.com/scripts-with-dependencies#exec-magic (disclosure: my site). In short: #! /bin/sh "exec" "/usr/bin/env" "uv" "run" "--quiet" "--script" "$0" "$@" # /// script # dependencies = [ # "cowsay", # ] # /// import cowsay cowsay.cow("Hello, world!") On systems that can't run uv, like NetBSD and OpenBSD, switch to pipx: #! /bin/sh "exec" "/usr/bin/env" "pipx" "run" "$0" "$@" # ...
- vovavili 11mo agoIf not having a working internet connection is a concern, I would package your script into a shiv zipapp - https://shiv.readthedocs.io/en/latest/ https://shiv.readthedocs.io/en/latest/