AnyEnv
Overview
AnyEnv provides a unified interface for executing code across different environments - local, subprocess, Docker containers, remote sandboxes, and more. Choose the right execution environment for your needs without changing your code.
Getting Started
HTTP Downloads
AnyEnv provides a unified interface for HTTP requests that works across different environments (including PyOdide):
from anyenv import get, post, download, get_json, get_text, get_bytes
# Simple GET request
response = await get("https://api.example.com/data")
print(response.status_code, response.text)
# Get JSON data directly
data = await get_json("https://api.example.com/users")
print(data) # Parsed JSON object
# Get text content
text = await get_text("https://example.com/page.html")
# Get binary data
data = await get_bytes("https://example.com/image.png")
# Download files
await download("https://example.com/file.zip", "local_file.zip")
# POST requests
response = await post("https://api.example.com/create", json={"name": "test"})
# POST JSON data directly
result = await post_json("https://api.example.com/api", {"key": "value"})
Synchronous Versions
All async functions have synchronous counterparts:
from anyenv import get_sync, get_json_sync, download_sync
# Synchronous versions (useful in non-async contexts)
response = get_sync("https://api.example.com/data")
data = get_json_sync("https://api.example.com/users")
download_sync("https://example.com/file.zip", "local_file.zip")
Error Handling
from anyenv import get, HttpError, RequestError, ResponseError
try:
response = await get("https://api.example.com/data")
except RequestError as e:
print(f"Request failed: {e}")
except ResponseError as e:
print(f"Server error: {e}")
except HttpError as e:
print(f"HTTP error: {e}")
Package Installation
Programmatically install Python packages across environments:
from anyenv import install, install_sync
# Install packages asynchronously
await install("requests")
await install(["numpy", "pandas"])
await install("package>=1.0.0")
# Synchronous installation
install_sync("matplotlib")
install_sync(["scipy", "sklearn"])
# Install with specific options
await install("package", upgrade=True, user=True)
Async Utilities
Utilities for running async/sync code and managing concurrency:
from anyenv import run_sync, run_sync_in_thread, gather, call_and_gather
# Run async function from sync context
result = run_sync(async_function())
# Run sync function in thread from async context
result = await run_sync_in_thread(sync_function, arg1, arg2)
# Enhanced gather with better error handling
results = await gather(
async_func1(),
async_func2(),
async_func3(),
return_exceptions=True
)
# Call function and gather results
func_results = await call_and_gather(
my_function,
[arg1, arg2, arg3], # Arguments to call function with
max_workers=5
)
Threading and Concurrency
Manage concurrent operations with ThreadGroup and spawners:
from anyenv import ThreadGroup, function_spawner, method_spawner
# ThreadGroup for managing multiple concurrent operations
async with ThreadGroup() as group:
# Add functions to run concurrently
group.spawn(some_function, arg1, arg2)
group.spawn(another_function, arg3)
# Wait for all to complete
results = await group.gather()
# Function spawner for reusable concurrent execution
spawner = function_spawner(my_function, max_workers=10)
results = await spawner([arg1, arg2, arg3, arg4])
# Method spawner for object methods
obj_spawner = method_spawner(my_object.method, max_workers=5)
results = await obj_spawner([data1, data2, data3])
Testing Utilities
Tools for testing and development:
from anyenv import open_in_playground
# Open interactive playground for testing (where supported)
await open_in_playground(locals())
Backend Selection
Choose HTTP backends based on environment:
from anyenv import get_backend, HttpBackend
# Get the best available backend for current environment
backend = get_backend()
# Use specific backend
backend = get_backend("httpx") # or "urllib", "requests"
response = await backend.get("https://example.com")
Environment Compatibility
All functionality automatically adapts to the execution environment:
- PyOdide: Uses browser-compatible implementations
- Standard Python: Uses optimal libraries (httpx, etc.)
- Limited environments: Falls back to stdlib implementations
- Async contexts: Provides async implementations
- Sync contexts: Provides synchronous alternatives
This ensures your code works consistently across web browsers, Jupyter notebooks, serverless functions, and traditional Python environments.
Metadata
Release files for anyenv 2.0.15
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| anyenv-2.0.15.tar.gz | 97.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| anyenv-2.0.15-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 258.9 kB
Release files / anyenv-2.0.15.tar.gz
| Download URL | anyenv-2.0.15.tar.gz |
|---|---|
| Size | 97.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e55d27982a42099034d1ea424f943255d61b9dcc4e073dd1b574993c4d09acae
|
|
BLAKE2b-256 checksum How to use checksums |
a179470d6fc8b16172292fd27d9c5ed112fc5efd0fa6c6636c9828071c21743f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / anyenv-2.0.15-py3-none-any.whl
| Download URL | anyenv-2.0.15-py3-none-any.whl |
|---|---|
| Size | 161.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eba488219d9865b0ea2bdd120f6e41c0ab33619185d8ba20a5fa28148d3c030f
|
|
BLAKE2b-256 checksum How to use checksums |
d432d7fbc87a89fe8f1e2ab871a8cc02839e900ac440c118d2101e12e322d5eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|