delusional 2 minutes ago

It's worth noting that this is not portable. The /usr/bin/env -S flag is not standardized by posix and not implemented on busybox.

BiteCode_dev an hour ago

Other neat tricks with uvx (uv equivalent of npx) to run one time commands in some contexts:

- alias download_mp3="uvx --no-cache --from yt-dlp[default] yt-dlp --extract-audio --audio-format mp3" to download sound from Youtube videos, SoundCloud pages, etc. This update yt-dlp every time, which is required given the counter measures change so often and the dl rarely affect the total processing time anyway (requires ffmpeg).

- "uvx --with <package> --with pyqt5 --from qtconsole jupyter qtconsole" starts a qtconsole (GUI version of ipython) with <package> installed so you can test it quickly. Temp venv, everything cached so next time it's instant, one single copy of pyqt5 for the current use no matter how many times you run those.

- "uvx --with virtualenv pipx run pipsi install nodejs-bin". Ok it's useless, but it's fun that it even works :)

uv's cache system and downloads optimization are quite smart, as Charlie marsh (astral CEO) explains in the interview: https://www.bitecode.dev/p/charlie-marsh-on-astral-uv-and-th...

mrweasel 3 hours ago

While neat, doesn't it also comes with certain issues?

Startup times has to be slower, but probably only for the first run?

There's a some level of violation of the "Principle Of Least Surprise", depending on the setting. For some it will be the reverse, the script they got just works, without any setup or package installation. For others we'll wonder why it just started downloading a bunch of packages we already have.

Probably not the greatest idea for production environments, where you should not or can not just pull in packages from the internet.

It's really cool that it works, but I think I'd recommended using it highly selectively.

  • BiteCode_dev an hour ago

    Definitely not for prod, but I used to have (and recommend: https://www.bitecode.dev/i/114175324/whats-a-good-name-for-a...) a giant venv just for my laptop scripts. Having one per script is too much, but none is inviting pain.

    The problem with that is that eventually too many scripts means you will hit incompatibilities in Python where you can only install one version of a lib in each venv.

    This trick is perfect because:

    - From now on, I always install uv on all my machines anyway.

    - After the first run, not only the cache make it fast, but it uses hard links so that you don't even pay the of multiple install on disk space (that's also how they are so fast in creating the envs, that and some interesting HTTP/zip tricks: https://www.bitecode.dev/p/charlie-marsh-on-astral-uv-and-th...).

    - Deps are clearly defined in the script, so it's self-documenting.

    For prod, shiv (https://shiv.readthedocs.io/) is probably your best bet but I'm betting uv will come up with a version of that soon.

  • chippiewill an hour ago

    > but probably only for the first run?

    It's slow on every run because it has to build the python virtual environment every time, even if it's cached all the packages

  • heresie-dabord an hour ago

    > Probably not the greatest idea for production environments

    Nor for any system where one takes care to not needlessly increase the threat surface.

smaddox 7 hours ago

I've been using this for a few weeks now, and it's really handy. But I did learn the hard way that it fails if you don't have internet connection, even if you already have the venv cached.

  • usrme 3 hours ago

    That's really unexpected! I'd default to the assumption that it would "just work" if all the dependencies are already met.

p4bl0 2 hours ago

It's a neat trick, but it still depends on uv being installed and network connectivity.

What's the advantage of this that makes it worth despite these constraints, compared to e.g. using pyinstaller [1] to build and distribute a single executable file with the python interpreter and all the dependencies of your project bundled in it in the exact versions you chose in your development virtual environment?

[1] https://pyinstaller.org/

  • chippiewill an hour ago

    It's not for production grade stuff, it's for small scripts you want to send to someone for a little job.

  • Hikikomori an hour ago

    Can just share a clear text script with a colleague over slack and let him just run it without extra steps.

thewisenerd 5 hours ago

this builds upon PEP 723, which is "accepted", so it's likely here to stay.

https://peps.python.org/pep-0723/

I've been very slowly migrating scripts to work with this, and `pipx run`. glad to know uv has also picked it up.

jas39 an hour ago

I have been doing this for a while. Voila:

#!/usr/bin/env -S uv run -q --no-project --python ">=3.12" --with "openai"

theanonymousone 2 hours ago

Maybe surprisingly, JBang has offered this functionality for Java since 2020. Happy we have it un Python too, now.

kixpanganiban 6 hours ago

Curious - how many containers and machines images these days come with uv by default?

ginko 2 hours ago

Doesn't look like my Ubuntu machine comes with 'uv' installed at least. Can't say I've ever heard of it either.

  • austinjp 2 hours ago

    It's the new hotness in Python package management:

    https://docs.astral.sh/uv/

    • fmajid an hour ago
      • teroshan an hour ago

        `uv` is not a new standard though, just a wrapper.

        • tspng an hour ago

          `uv` is definitely not a wrapper. It's written from scratch. If you mean by wrapper that it's mostly compatible with pip (using `uv pip`), that's one of their adoption strategies to make it easier to switch to. But it does a lot more than that.

        • wasyl 37 minutes ago

          I mean, it's right there as the first highlight in the docs

          > A single tool to replace pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv, and more.

jauntywundrkind 3 hours ago

Zx adds a couple nice ease of use things to node.js, designed to help shell scripting. Among other things, if you call /usr/bin/env zx, it will automatically retrieve any module imports you have in your code! https://github.com/google/zx