Skip to main content

No project description provided

Project description

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.

Project details


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.0.2.tar.gz (667.9 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.0.2-cp314-cp314-win_amd64.whl (19.5 MB view details)

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14manylinux: glibc 2.39+ x86-64

sailpy-1.0.2-cp314-cp314-macosx_15_0_arm64.whl (22.1 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

sailpy-1.0.2-cp313-cp313-macosx_15_0_arm64.whl (22.1 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

sailpy-1.0.2-cp312-cp312-macosx_15_0_arm64.whl (22.1 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

sailpy-1.0.2-cp311-cp311-macosx_15_0_arm64.whl (22.1 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

sailpy-1.0.2-cp310-cp310-macosx_15_0_arm64.whl (22.1 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

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

File metadata

  • Download URL: sailpy-1.0.2.tar.gz
  • Upload date:
  • Size: 667.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for sailpy-1.0.2.tar.gz
Algorithm Hash digest
SHA256 00a5f18f38e8e9f7929087aa163a6d1369eb35fdd12ca3a3fe8ae08eca6ed3e4
MD5 4b2294cb20e04c882d7105a2d750f8c4
BLAKE2b-256 133f7c9f357378d6a294a547e13e234e3762c70bcf80f8638d8f935614d84242

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2.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.0.2-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.0.2-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/6.1.0 CPython/3.13.12

File hashes

Hashes for sailpy-1.0.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 94075d59dc7cb71286cba461649a5d79eedf67f9f70ddf9f60cf472965432045
MD5 35b7693be4d691ee947a4d93f1685277
BLAKE2b-256 185bed5a373a8dccd535ea0f746d45c9e5816748272cb64f8e65a2f4643c21be

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp314-cp314-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp314-cp314-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 aa93dc0214a95bc92ed372268a62bbd9267710274f87b2ba1805709935052a8a
MD5 5969d985653144519ad2834f80645cf5
BLAKE2b-256 de69be16a8a016dafa13cfaee6d9373c908b14703c9532305ba7f8e59f94cdfc

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 60eacabe4cffc5dc5f07c46a0dc7fb65a6004a5a654277814d6b92915d95f6d9
MD5 2a9a5a0e38bb59726131ce22814b0e5b
BLAKE2b-256 f53a60cd1929d613e73ff9ad603ba5f0a63a8ca8134c25611a4e7ea093c33679

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.0.2-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/6.1.0 CPython/3.13.12

File hashes

Hashes for sailpy-1.0.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 63b529ea8e8a10e9784c98d839fe3124a844b334514b1491a31c4221b2de8a23
MD5 9889eee6ddf08abcc8cc8946b71c6347
BLAKE2b-256 ccc8bf1e5f7dbd7153a27ecca28de66421f1410f73d9094d480a00d83618bad8

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6266150ef4df6f69510d17f573fbf833b08df9d8801ec729012da95ffc987fb5
MD5 ac20a2af0a20f0170567151d9ad098a0
BLAKE2b-256 c0c42abd72a23fabafedd983c0100f5970a3627da922bf48046f60e87f01e67e

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c58e12a098db9ab2b39e0da0ab676daaedf22805cb5f2c915041f8a40ee9b020
MD5 27149ae2804c9d7e0bdd145f726124a7
BLAKE2b-256 5d3df09b0ed9fd96173935daa503c4a47eca0f0ca1f6398283bc85512e73511f

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.0.2-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/6.1.0 CPython/3.13.12

File hashes

Hashes for sailpy-1.0.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 33297c4fafe68f92f36b6aafcc5d7a553e43423fdd3e770c5076aa31ad0609af
MD5 82706a9ca25b4c6a88d64f3b4b59610f
BLAKE2b-256 8f4094cfa05d842df260565ab0a02ae94a4cf6a688023e814cddd3d7ec2ca645

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b726dddd597119e727c744e8b5527cc8bcee12b4e4f4ef129f3954b4aa2e1cd8
MD5 6ec65e0ff5c43fd2255f57f0b0842ed6
BLAKE2b-256 4850bd516b3988a892b52b1d4ff615192af2efd970632d93935f52293d0b7380

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 be9e51f458f3e150e49b5fb65ac0b49429090751599c3c1fe6e4542ffe9eb844
MD5 2ba057c4fe48ab0fcd0c157f3854e57e
BLAKE2b-256 10706dbc1077ec312cbc497718323c46895637210ebdbcb50e25cdf9dab877fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.0.2-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/6.1.0 CPython/3.13.12

File hashes

Hashes for sailpy-1.0.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 bba138119ab8ba630af68a0ff480e252df6d879b7d1e428a63e1fc3d8f7a99f2
MD5 eb03e366ef4269a8e973c3eaeae6202b
BLAKE2b-256 c8f4d0f0b768cf93a978a635e0444396c39bcb5762153448765ca38561bc9a63

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b7ecf7dfb5802923112143b4e9418ed54b838e639b35e4992fb8d744eff07673
MD5 bc8356e8d0353f3b38f9c7612b1c996c
BLAKE2b-256 8534ef0374bb4750d7e1ebf38592aa1c65e7142cc88103fb96ddd9cc16190836

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7f6a7b748e2f9276c86823e89e34ca4bd04c9417d49487bbfa678edb14ee3798
MD5 0440e2fccbaaeb9394d794558e94e2c4
BLAKE2b-256 03ba2729833be72f8f91a148430bdc8bb91715d71c8338a20a0f50af502dddc6

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: sailpy-1.0.2-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/6.1.0 CPython/3.13.12

File hashes

Hashes for sailpy-1.0.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a0403cfa15ccf5604d2deefadd30a8b9c89c5165ab537998ec6545fcbdff92c6
MD5 30aa45175928c02b3446a143a9afdb94
BLAKE2b-256 00190a30a70d8278a63536fc05cc82ce0bdec4ca644e649f1225700ebf388dfa

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 65efe4c26be1e75d18343c612d4ef3ac7bcdd74cd732b1f8be9c6b73ab37aba5
MD5 e1c5890357dd0932c0100717db8e5bbe
BLAKE2b-256 7fd6d815bc4cfe0e195e50e061c0364e4921b3204eca005b6ec9d82c6f369b27

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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.0.2-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sailpy-1.0.2-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3ec2e7c1ae34e34c9db61182c6a7d82a37c65e79bdc554bd67f236f416622903
MD5 bd21aaa02e6df2e0bf42317595d2c7cc
BLAKE2b-256 8dd697e3d66f58f50178b6b957c427740d3f975ef6f7aee81945b0743673dce0

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.2-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 Pingdom Monitoring Sentry Error logging StatusPage Status page