GitXplorerGitXplorer
k

uvtrick

public
169 stars
6 forks
1 issues

Commits

List of commits on branch main.
Unverified
2d1c10f90ff06732cafdb3c5365dac253806aa22

remove old versions

kkoaning committed a month ago
Unverified
fd878f35fdfd79a0a4a1a17f00559779e2409fb4

remove old versions

kkoaning committed a month ago
Unverified
0a2eed95d5ff28dffe758fa37e758518dc4ef584

install

kkoaning committed a month ago
Unverified
3da335a45d34612748d7f071063e8c3ea45afe73

moar

kkoaning committed a month ago
Verified
2d7f279fd9915d981d4dda28c4361d6241134055

Merge pull request #24 from timvink/patch-1

kkoaning committed a month ago
Verified
38c64b6323545da696e26878e8a812cd53507162

Loosen cloudpickle requirement

ttimvink committed 2 months ago

README

The README file for this repository.

uvtrick

A fun party trick, via uv and pickle, to run Python code from another venv ... into this one.

Quickstart

You can install this tool via:

uv pip install uvtrick

Usage

External scripts

There are a few ways to use this library. The first one is to use the load function to point to a Python script that contains the function you want to use. This function assumes that the script carries inline script metadata.

from uvtrick import load

# Load the function `add` from the file `some_script.py`
# It runs in another virtualenv, but you get back the response via pickle. 
# Be aware of the limitations, please only consider base Python objects.
add = load("some_script.py", "add")

# This result is from the `some_script.py` file, running in another virtualenv 
# with `uv`. A pickle in a temporary file is used to communicate the result.
add(1, 2)  # 3

From within Python

But you can also take it a step further and use the Env class to run a function in a specific environment.

from uvtrick import Env

# For illustration purposes, let's assume that rich is not part of the current environment. 
# Also note that all the imports happen inside of this function. 
def uses_rich():
    from rich import print
    from importlib import metadata

    version = metadata.version("rich")
    print(f"hello from rich=={version}")

# This runs the function `uses_rich` in a new environment with the `rich` package installed.
# Just like the `load` function before, the result is returned via pickle. 
Env("rich", python="3.12").run(uses_rich)

This approach is pretty useful if you are interested in running the same function in different versions of a dependency to spot a performance regression. You might be able to do that via something like:

from uvtrick import Env

def uses_rich(a, b):
    from rich import print
    from importlib import metadata

    version = metadata.version("rich")
    print(f"hello from rich=={version}")
    return a + b

for version in (10, 11, 12, 13):
    Env(f"rich=={version}", python="3.12").run(uses_rich, a=1, b=2)

Be aware that a lot of pickling is happening under the hood here. This can be a problem if you are trying to pickle large objects or if your function is returning an object that needs a dependency that is not installed in the environment that is calling Env.

Also note that thusfar this entire project is merely the result of a very entertaining recreational programming session. We might want to gather some community feedback before suggesting production usage.