Skip to main content

sailpy - Python bindings for SAIL

The missing small and fast image decoding library for humans (not for machines).

Features

  • Fast - Written in C/C++ for maximum performance
  • 20+ image formats - JPEG, PNG, WebP, AVIF, TIFF, GIF, BMP, and more
  • Format conversion - Easy pixel format conversion
  • Metadata support - Access EXIF, ICC profiles, and more
  • NumPy integration - Zero-copy access to pixel data
  • Clean API - Simple and intuitive interface

Installation

Pre-built wheels with all dependencies included:

pip install sailpy

Quick Start

import sailpy
import numpy as np

# Load an image
image = sailpy.Image.from_file("photo.jpg")
print(f"Size: {image.width}x{image.height}")

# Convert to NumPy array (zero-copy!)
pixels = image.to_numpy()

# Process with NumPy
inverted = 255 - pixels

# Save result
new_image = sailpy.Image.from_numpy(inverted, image.pixel_format)
new_image.save("output.png")

Supported Formats

Format Load Save Features
AVIF Modern efficient format
BMP Windows Bitmap
GIF Animations
JPEG Lossy compression
JPEG 2000 Advanced JPEG
JPEG XL Next-gen format
PNG Lossless with alpha
PSD Photoshop files
QOI Quite OK Image
SVG Vector graphics
TGA Targa
TIFF Multi-page support
WebP Google's format

...and more! See full list.

Examples

The package includes comprehensive examples demonstrating various features:

# View all available examples
import sailpy.examples
print(sailpy.examples.__doc__)

Run examples from command line:

python -m sailpy.examples.01_quickstart
python -m sailpy.examples.12_image_viewer  # Qt-based image viewer

Available examples:

  • 01_quickstart.py - Basic image loading and saving
  • 02_memory_io.py - Working with memory buffers
  • 03_features_and_options.py - Codec features and save options
  • 04_numpy_integration.py - NumPy array integration
  • 05_multiframe.py - Multi-frame image handling
  • 06_probe.py - Image probing without full loading
  • 07_codec_info.py - Querying codec information
  • 08_logging.py - Logging configuration
  • 09_image_transformations.py - Image transformations
  • 10_enum_usage.py - Working with enums
  • 11_advanced_saving.py - Advanced saving options
  • 12_image_viewer.py - Simple Qt-based image viewer

Basic Loading and Saving

import sailpy

# Load
image = sailpy.Image.from_file("input.jpg")
print(f"Format: {image.pixel_format}")
print(f"Size: {image.width}x{image.height}")

# Save in different format
image.save("output.png")

Format Conversion

import sailpy

image = sailpy.Image.from_file("input.jpg")

# Convert to RGBA
image.convert(sailpy.PixelFormat.BPP32_RGBA)

image.save("output.png")

NumPy Integration

import sailpy
import numpy as np

# Load image
image = sailpy.Image.from_file("photo.jpg")

# Get NumPy array (zero-copy when possible!)
pixels = image.to_numpy()
print(f"Array shape: {pixels.shape}")

# Apply filters
brightened = np.clip(pixels * 1.2, 0, 255).astype(np.uint8)

# Create new image from array
result = sailpy.Image.from_numpy(brightened, image.pixel_format)
result.save("brightened.png")

Batch Conversion

import sailpy
from pathlib import Path

input_dir = Path("images")
output_dir = Path("converted")
output_dir.mkdir(exist_ok=True)

for img_path in input_dir.glob("*.jpg"):
    image = sailpy.Image.from_file(str(img_path))
    image.convert(sailpy.PixelFormat.BPP24_RGB)
    image.save(str(output_dir / f"{img_path.stem}.png"))

Image Information

import sailpy

image = sailpy.Image.from_file("photo.jpg")

print(f"Dimensions: {image.width}x{image.height}")
print(f"Pixel format: {image.pixel_format}")
print(f"Bits per pixel: {image.bits_per_pixel}")
print(f"Is RGB: {image.is_rgb_family}")
print(f"Is grayscale: {image.is_grayscale}")

Creating Images from Scratch

import sailpy
import numpy as np

# Create a new image
image = sailpy.Image(sailpy.PixelFormat.BPP24_RGB, 640, 480)

# Fill with color using NumPy
pixels = image.to_numpy()
pixels[:] = [0, 128, 255]  # Blue color

# Or create gradient
pixels[:, :, 0] = np.linspace(0, 255, 640)  # Red gradient

image.save("created.png")

Error Handling

import sailpy

# Error handling with specific exceptions
try:
    image = sailpy.Image.from_file("image.xyz")
except FileNotFoundError:
    print("File not found")
except ValueError as e:
    print(f"Unsupported format or invalid parameters: {e}")
except Exception as e:
    print(f"Error loading image: {e}")

# Check if format is supported before loading
try:
    codec = sailpy.CodecInfo.from_path("image.xyz")
    if not codec.can_load:
        print(f"Format {codec.name} cannot load images")
    else:
        image = sailpy.Image.from_file("image.xyz")
except ValueError:
    print("Format not supported")
except FileNotFoundError:
    print("File not found")

Multi-Frame Images (Animations)

import sailpy

# Load animated GIF or multi-page TIFF
input = sailpy.ImageInput("animation.gif")
frames = input.load_all()

print(f"Total frames: {len(frames)}")

# Process each frame
for i, frame in enumerate(frames):
    print(f"Frame {i}: {frame.width}x{frame.height}, delay={frame.delay}ms")
    # Extract individual frames
    frame.save(f"frame_{i:03d}.png")

# Or iterate frame by frame (memory efficient)
input = sailpy.ImageInput("animation.gif")
for i, frame in enumerate(input):
    print(f"Processing frame {i}")
    # Process frame...

# Load with custom options
options = sailpy.LoadOptions()
input = sailpy.ImageInput("image.tiff").with_options(options)
frames = input.load_all()

Working with Memory (Bytes)

import sailpy
import requests

# Load from HTTP
response = requests.get("https://example.com/image.jpg")
image = sailpy.Image.from_bytes(response.content)

# Save to memory
image_bytes = image.to_bytes("png")
print(f"PNG size in memory: {len(image_bytes)} bytes")

# Send over network, save to database, etc.

Image Transformations

import sailpy

image = sailpy.Image.from_file("photo.jpg")

# Rotate (creates new image)
rotated = image.rotate_to(sailpy.Orientation.ROTATED_90)
rotated.save("rotated_90.jpg")

# Mirror (in-place)
image.mirror(sailpy.Orientation.MIRRORED_HORIZONTALLY)
image.save("mirrored.jpg")

# Rotate in-place
image.rotate(sailpy.Orientation.ROTATED_180)
image.save("rotated_180.jpg")

# Apply EXIF orientation
if image.source_image and image.source_image.orientation:
    corrected = image.rotate_to(image.source_image.orientation)
    corrected.save("corrected.jpg")

Advanced: Frame-by-Frame Writing

import sailpy

# Save multi-page TIFF (memory efficient for large datasets)
output = sailpy.ImageOutput("document.tiff")

# Optional: Set save options
options = sailpy.SaveOptions()
options.compression = sailpy.Compression.DEFLATE
options.compression_level = 6
output = output.with_options(options)

# Save pages one by one
for page_num in range(10):
    # Create or load page
    page = sailpy.Image(sailpy.PixelFormat.BPP24_RGB, 1024, 768)
    # ... fill page data ...

    output.save(page)

output.finish()
print("Multi-page document created")

API Reference

Core Classes

Image

Main class representing an image with pixel data.

Constructors:

Image()  # Create invalid image
Image(path: str)  # Load from file
Image(pixel_format: PixelFormat, width: int, height: int)  # Create empty

Properties:

  • width: int - Image width in pixels
  • height: int - Image height in pixels
  • pixel_format: PixelFormat - Pixel format
  • bits_per_pixel: int - Bits per pixel
  • bytes_per_line: int - Bytes per scan line
  • pixels_size: int - Total pixel data size
  • gamma: float - Gamma value
  • delay: int - Animation frame delay (milliseconds)
  • resolution: Resolution - Image resolution
  • source_image: SourceImage - Source image information
  • meta_data: MetaData - Image metadata (EXIF, etc.)
  • iccp: Iccp - ICC profile
  • palette: Palette - Color palette (for indexed images)

Properties:

  • is_valid: bool - Check if image is valid
  • is_rgb_family: bool - Check if RGB-like format
  • is_grayscale: bool - Check if grayscale
  • is_indexed: bool - Check if indexed (palette-based)

Methods:

  • from_file(path: str) -> Image - Load from file (static)
  • load(path: str) - Load from file (instance method)
  • save(path: str, options: SaveOptions = None) - Save to file
  • convert(pixel_format: PixelFormat) - Convert pixel format (in-place)
  • convert_to(pixel_format: PixelFormat, options: ConversionOptions = None) -> Image - Convert to new image
  • rotate(orientation: Orientation) - Rotate image (in-place)
  • rotate_to(orientation: Orientation) -> Image - Rotate to new image
  • mirror(orientation: Orientation) - Mirror image (in-place)
  • to_numpy() -> np.ndarray - Get NumPy array view (zero-copy when possible)
  • from_numpy(array: np.ndarray, pixel_format: PixelFormat) -> Image - Create from NumPy array (static)

ImageInput

Low-level interface for loading images with more control.

# Basic usage
input = ImageInput(path: str)
frames = input.load_all()  # Load all frames
frame = input.next_frame()  # Load next frame
input.stop()  # Stop loading

# With custom options (builder pattern)
options = LoadOptions()
input = ImageInput("image.tiff").with_options(options)
frames = input.load_all()

# Force specific codec (for files with wrong/missing extension)
codec = CodecInfo.from_name("png")
input = ImageInput("image.dat").with_codec(codec)

ImageOutput

Low-level interface for saving images with more control.

# Basic usage
output = ImageOutput(path: str)
output.save(image: Image)
output.finish()

# With save options (builder pattern)
options = SaveOptions()
options.compression = Compression.JPEG
output = ImageOutput("output.tiff").with_options(options)
output.save(image)
output.finish()

# Force specific codec (for files with custom extension)
codec = CodecInfo.from_name("tiff")
output = ImageOutput("output.dat").with_codec(codec)

CodecInfo

Information about image format codecs.

Methods:

  • from_extension(ext: str) -> CodecInfo - Get codec by extension
  • from_path(path: str) -> CodecInfo - Get codec from file path
  • from_mime_type(mime: str) -> CodecInfo - Get codec by MIME type
  • list() -> List[CodecInfo] - Get all available codecs

Properties:

  • name: str - Codec name
  • description: str - Codec description
  • version: str - Codec version
  • extensions: List[str] - Supported file extensions
  • mime_types: List[str] - Supported MIME types
  • magic_numbers: List[bytes] - Magic number patterns
  • can_load: bool - Can load images
  • can_save: bool - Can save images
  • is_valid: bool - Check if codec info is valid
  • load_features: LoadFeatures - Supported load features
  • save_features: SaveFeatures - Supported save features

Enums

PixelFormat

Pixel format enumeration.

RGB formats:

  • BPP24_RGB, BPP24_BGR - 24-bit RGB/BGR
  • BPP32_RGBA, BPP32_BGRA - 32-bit RGB/BGR with alpha
  • BPP48_RGB, BPP48_BGR - 48-bit RGB/BGR
  • BPP64_RGBA, BPP64_BGRA - 64-bit RGB/BGR with alpha

Grayscale:

  • BPP8_GRAYSCALE, BPP16_GRAYSCALE - 8/16-bit grayscale
  • BPP8_GRAYSCALE_ALPHA, BPP16_GRAYSCALE_ALPHA - With alpha

Indexed:

  • BPP1_INDEXED, BPP2_INDEXED, BPP4_INDEXED, BPP8_INDEXED

Compression

Compression types for saving images.

Values: NONE, RLE, JPEG, DEFLATE, LZW, ZIP, ZSTD, etc.

LogLevel

Logging levels.

Values: SILENCE, ERROR, WARNING, INFO, DEBUG, TRACE

Support Classes

SaveOptions

Options for saving images.

options = SaveOptions()
options.compression = Compression.DEFLATE
options.compression_level = 6

# Codec-specific tuning (dict[str, Variant])
# IMPORTANT: Set the whole dict, not individual keys
options.tuning = {"png-filter": Variant("paeth")}  # PNG: none, sub, up, avg, paeth

# Use with ImageOutput
output = ImageOutput("output.png").with_options(options)
output.save(image)
output.finish()

LoadOptions

Options for loading images.

options = LoadOptions()
# Most codecs don't require load options
# LoadOptions.tuning is available for codec-specific settings if needed

# Use with ImageInput
input = ImageInput("image.tiff").with_options(options)
frames = input.load_all()

Resolution

Image resolution information.

# Create and set resolution for an image
resolution = Resolution()
resolution.x = 300
resolution.y = 300
resolution.unit = ResolutionUnit.INCH

# Assign via property
image.resolution = resolution

# Access existing resolution
print(f"DPI: {image.resolution.x}x{image.resolution.y} {image.resolution.unit}")

MetaData

Image metadata container.

# Load metadata from loaded image
image = Image.from_file("photo.jpg")
meta = image.meta_data
if meta:
    print(f"Key: {meta.key()}")
    value = meta.value  # Property, not method
    if value.has_string():
        print(f"Value: {value.to_string()}")

# Create and set metadata
new_meta = MetaData()
new_meta.set_key(MetaDataType.ARTIST)

variant = Variant()
variant.set_string("John Doe")
new_meta.set_value(variant)

# Add to image
image.set_meta_data([new_meta])

Functions

set_log_barrier(level: LogLevel)

Set minimum logging level.

sailpy.set_log_barrier(sailpy.LogLevel.DEBUG)

set_logger(callback: Callable)

Set custom logging callback.

def my_logger(level, message):
    print(f"[SAIL {level}] {message}")

sailpy.set_logger(my_logger)

Version Information

import sailpy

# Get version string
print(sailpy.__version__)  # e.g., "0.9.10"

Example Modules

The sailpy.examples package contains working examples:

# Find examples location
import sailpy.examples
print(sailpy.examples.__path__)

# Run programmatically
from sailpy.examples import example_01_quickstart
# example_01_quickstart.main()  # If example has main()

Performance

SAIL is designed for performance:

  • Zero-copy NumPy integration when possible
  • Efficient C/C++ implementation
  • Optimized codecs
  • Minimal memory allocations

See benchmarks comparing SAIL to other libraries.

Requirements

  • Python 3.9+
  • NumPy 1.20+

Building from Source

git clone https://github.com/HappySeaFox/sail.git
cd sail/src/bindings/python
pip install -e .

License

MIT License - see LICENSE for details.

Links

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Download files

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

Source Distribution

sailpy-1.1.0.tar.gz (669.8 kB view details)

Uploaded Source

Built Distributions

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

sailpy-1.1.0-cp314-cp314-win_amd64.whl (19.5 MB view details)

Uploaded CPython 3.14Windows x86-64

sailpy-1.1.0-cp314-cp314-manylinux_2_39_x86_64.whl (69.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.39+ x86-64

sailpy-1.1.0-cp314-cp314-macosx_15_0_arm64.whl (22.4 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

sailpy-1.1.0-cp313-cp313-win_amd64.whl (19.0 MB view details)

Uploaded CPython 3.13Windows x86-64

sailpy-1.1.0-cp313-cp313-manylinux_2_39_x86_64.whl (69.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

sailpy-1.1.0-cp313-cp313-macosx_15_0_arm64.whl (22.4 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

sailpy-1.1.0-cp312-cp312-win_amd64.whl (19.0 MB view details)

Uploaded CPython 3.12Windows x86-64

sailpy-1.1.0-cp312-cp312-manylinux_2_39_x86_64.whl (69.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

sailpy-1.1.0-cp312-cp312-macosx_15_0_arm64.whl (22.4 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

sailpy-1.1.0-cp311-cp311-win_amd64.whl (19.0 MB view details)

Uploaded CPython 3.11Windows x86-64

sailpy-1.1.0-cp311-cp311-manylinux_2_39_x86_64.whl (69.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

sailpy-1.1.0-cp311-cp311-macosx_15_0_arm64.whl (22.4 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

sailpy-1.1.0-cp310-cp310-win_amd64.whl (19.0 MB view details)

Uploaded CPython 3.10Windows x86-64

sailpy-1.1.0-cp310-cp310-manylinux_2_39_x86_64.whl (69.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

sailpy-1.1.0-cp310-cp310-macosx_15_0_arm64.whl (22.4 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file sailpy-1.1.0.tar.gz.

File metadata

  • Download URL: sailpy-1.1.0.tar.gz
  • Upload date:
  • Size: 669.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sailpy-1.1.0.tar.gz
Algorithm Hash digest
SHA256 8ab211ed525c92bbcca207bda70f2a9fb592564b59fed57742dfbbcd4db3678c
MD5 f3665a67db0ce7db700ca62da3b58af8
BLAKE2b-256 4a0563e11732b23e68dfb10d54ace8802d69c50de32abe7ffa887fabc55d8fe1

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0.tar.gz:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.1.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 19.5 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sailpy-1.1.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 a5ea93c889cafa58b748dabd9b7867b2f97b7f73dcb9db7118bdfb4a40ea53a9
MD5 532e27daefc841d876705d981130d585
BLAKE2b-256 4f033f90156510d2dc8770d445b118998559e129890183d199f75c5c660db81e

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp314-cp314-win_amd64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp314-cp314-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp314-cp314-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 14dc587a86ebad3ce14c3a666b3ade738fab122edbe6244f7572a8937f19883e
MD5 53f1fc52d94f90a3e75b6c7f1065ce52
BLAKE2b-256 a235e46f3dec918e2483bb8b5f93c1d1af076cc7badd6795ac751adda12132e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp314-cp314-manylinux_2_39_x86_64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 dbc7f4000ad9108f022ee9e31fa38e187347f464d47efa8cb6f3bb030947a311
MD5 7ced37ecbdb810ddfff8164cd1a1d078
BLAKE2b-256 eb983cf988c1403bf0c521e727306ea40dee0a353bbf7eb72f3e58e2c8b281fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp314-cp314-macosx_15_0_arm64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.1.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 19.0 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sailpy-1.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 35b10bf37c5d030234b04f0531d864c206f96acfb8f64d86791d06f867f42a50
MD5 6cfa2267aef5b4566ab05ccd7c867ce5
BLAKE2b-256 918f88304b65427d0a7ec0a0cd108df7ae851d27f17e69a842ed46cecd8c0d0a

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp313-cp313-win_amd64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 adb1e712643c40b818e69d876ca9d6093cd3d56c7cfee5eb267b22deec06302e
MD5 99141d3de33905214a57facd9fa1da09
BLAKE2b-256 d8730c56e512fe197c99d1ba8c9f1376fc1d2fb5f8aab7bee14cef2897e807a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp313-cp313-manylinux_2_39_x86_64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 78eab7f685ce212e5393cb594ab91583ad549a90289f782a1a642f33bc03cdf7
MD5 2beb5a19149829c9dc411cbad42773c2
BLAKE2b-256 01da75d1c13f6eed7c5a6905f7ad16d7a63e969bb959cfb1beb72fd639c6dbc0

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp313-cp313-macosx_15_0_arm64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.1.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 19.0 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sailpy-1.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 85da08cb9edeca2a825760aed2493a6f160af6f73060e91ec5f375db5b3d5d26
MD5 3a4b5849edb9c0f4512033e6f31a4000
BLAKE2b-256 78cdfe3e1f13d16f999c8d0915aa45b1d2510dc047015ec3f0a0c9983f498e27

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp312-cp312-win_amd64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 d1f37da475692b9d8bd75b1f8b167bf1b604d54cb075db88cfdbf8a5a4cd9e0e
MD5 e1547fc252448b09fdcebdf16f67890a
BLAKE2b-256 36fdae62806519b892b903e2cd1fa0597025987a09eab2b5923b91edc6f634f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp312-cp312-manylinux_2_39_x86_64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f79298d8308c147dd4b34902cd63a55a9d42d458cf21d6ae7b18a8d625b22ac4
MD5 da11201b61977f09caf13b223d5d400f
BLAKE2b-256 c697499136996e2fedc49620fcccca07daf993f7ed747d7ae7db75f6ccd1c38c

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp312-cp312-macosx_15_0_arm64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.1.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 19.0 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sailpy-1.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 987fe60856b7f47db2e9229008c70d9458ec6bd9a3923f2936191f64d5d87ef8
MD5 68f9b67e243da2afe97300326334483f
BLAKE2b-256 1ed50729215eab4745c07e194b29f2785c6d0bd1b7e1bb29478f8060b9e87ef0

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp311-cp311-win_amd64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 cd0cd4b96064fe37e98a687e8d92cb1e0dfa9fad46d40992acc4ad240238ac46
MD5 a3adb9b8923bf783c770e0fdf4cb48ec
BLAKE2b-256 7d192c871bb3e7931883de6b33fadb7d1c1b84b5600f37c8b8553056edc14383

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp311-cp311-manylinux_2_39_x86_64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 325abfa6f798844303fbbaf50b1627dfa4e38b1b40c8bdc6a5a8589c5a7fedc4
MD5 6386b388690e5dc97d0b0097a6db1196
BLAKE2b-256 a4b04ec8935d04412db4f64ef52ed9508b3baa34d46761562e559190cd2a20bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp311-cp311-macosx_15_0_arm64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.1.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 19.0 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sailpy-1.1.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9fd3a4f5f406915baf584b8471b738b1af2017a47caf803b15c53fbf5dc69a4b
MD5 04214764f036206395534b5b18489608
BLAKE2b-256 92d6889073608fc581ee52593fa4ff012e0af9e2d21f67c0ca15a0935ef4537e

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp310-cp310-win_amd64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 206c0b3e3e9a75a08640ba3aec3695d32391d6b3552c6fa0443ac87301aac8af
MD5 4ab38e157e5799399abc3f87008f86d4
BLAKE2b-256 dddcdde96ef355934e5fc09353469920ff6be691e68505ffd3f79231f8fd765b

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp310-cp310-manylinux_2_39_x86_64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sailpy-1.1.0-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.1.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 214424091eec358c1f124b98bc995e5ebb32ac2c6802c0f4bd771b1591afd777
MD5 27ea7e0e9f679ea1d10455c5250ce494
BLAKE2b-256 7ee27421049f6ae7e2c42c0fd4ba2e0c5ec24d097b9439d7af09690ea134e1b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.1.0-cp310-cp310-macosx_15_0_arm64.whl:

Publisher: build-python-wheels.yml on HappySeaFox/sail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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