GitXplorerGitXplorer
k

uvtrick

public
169 stars
6 forks
1 issues

Commits

List of commits on branch main.
Unverified
353a051c206f83bc6149f32a149f51033da3638e

version bump 0.4.2

kkoaning committed 16 days ago
Verified
fa473faf595a19bdf5c5902af9d7aedd03706b53

Merge pull request #26 from koaning/more-tests

kkoaning committed 16 days ago
Verified
a99681e4ad3c4b66d10279e3c6eb2d583e30d29f

Merge pull request #27 from timvink/more-tests

kkoaning committed 16 days ago
Verified
91c3e7298d87cc9a43dbe023d34b5f19a88211fa

fix

ttimvink committed 16 days ago
Verified
eb4487879c918477f334a6c44d4585fd11c5789e

fix

ttimvink committed 16 days ago
Verified
5c7fb43acec1ab0ab2bce0d1fa726239ae68c1b8

reduce numpy version

ttimvink committed 16 days 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.