Skip to main content

Compatibility layer for some basic operations to allow painless operation in PyOdide and Python pre-releases

Project description

AnyEnv

PyPI License Package status Monthly downloads Distribution format Wheel availability Python version Implementation Releases Github Contributors Github Discussions Github Forks Github Issues Github Issues Github Watchers Github Stars Github Repository size Github last commit Github release date Github language count Github commits this month Package status PyUp

Read the documentation!

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.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

anyenv-2.0.15.tar.gz (97.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

anyenv-2.0.15-py3-none-any.whl (161.0 kB view details)

Uploaded Python 3

File details

Details for the file anyenv-2.0.15.tar.gz.

File metadata

  • Download URL: anyenv-2.0.15.tar.gz
  • Upload date:
  • Size: 97.8 kB
  • Tags: Source
  • Uploaded using 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}

File hashes

Hashes for anyenv-2.0.15.tar.gz
Algorithm Hash digest
SHA256 e55d27982a42099034d1ea424f943255d61b9dcc4e073dd1b574993c4d09acae
MD5 e75c90b0a94f10f4a73962ca1e6afcd4
BLAKE2b-256 a179470d6fc8b16172292fd27d9c5ed112fc5efd0fa6c6636c9828071c21743f

See more details on using hashes here.

File details

Details for the file anyenv-2.0.15-py3-none-any.whl.

File metadata

  • Download URL: anyenv-2.0.15-py3-none-any.whl
  • Upload date:
  • Size: 161.0 kB
  • Tags: Python 3
  • Uploaded using 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}

File hashes

Hashes for anyenv-2.0.15-py3-none-any.whl
Algorithm Hash digest
SHA256 eba488219d9865b0ea2bdd120f6e41c0ab33619185d8ba20a5fa28148d3c030f
MD5 cb7d985fcf1c4fa9694841ab164d8b37
BLAKE2b-256 d432d7fbc87a89fe8f1e2ab871a8cc02839e900ac440c118d2101e12e322d5eb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page