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

Uploaded CPython 3.14Windows x86-64

sailpy-1.0.1-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.1-cp314-cp314-macosx_15_0_arm64.whl (22.1 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

sailpy-1.0.1-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.1-cp313-cp313-macosx_15_0_arm64.whl (22.1 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

sailpy-1.0.1-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.1-cp312-cp312-macosx_15_0_arm64.whl (22.1 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

sailpy-1.0.1-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.1-cp311-cp311-macosx_15_0_arm64.whl (22.1 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

sailpy-1.0.1-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.1-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.1.tar.gz.

File metadata

  • Download URL: sailpy-1.0.1.tar.gz
  • Upload date:
  • Size: 667.7 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.1.tar.gz
Algorithm Hash digest
SHA256 76838a38c852e85c66de1f9f779d0f57df0e259b3a4de45509574d8daa61df55
MD5 76ae67f1b9271f895b052beb250d9ab1
BLAKE2b-256 18ea6fe0af77874ba84aa37d48d465ed7009cb7bed80b187b4debdc21b3fac23

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: sailpy-1.0.1-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.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ff79706ba218ff770acb39590770ac68cf359fe6a942990e061a9239121675f6
MD5 26c363fbb57f370f2b35d6df16570b7a
BLAKE2b-256 7e6c51412851e78a275b8b273d0052c608d2c93daf1a320796b94c5705365ebd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp314-cp314-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 4fb51da2c3256c2de1f1a51697c5cc8714688e84a83ed9718314db7341c9defc
MD5 57e3968ea564afe23cdf9f057dd3aaf9
BLAKE2b-256 4f806586aaa274684e062f4883fb1a326b440c3d0e76b52a37252f5eee537ebc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 20ba1680ad29ada621de98c3a1d46a261355fbc44dc98454df11b9c69cc7d326
MD5 dd4a745ee2e0ee421adb2d990b669a3b
BLAKE2b-256 36589cefd06b5716866b1739bde802df89ce8ec41854604f443363adb32d28d2

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: sailpy-1.0.1-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.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 573eba0d5990d0ac71d1b54f66015c4aef2e8b6176c12a7544f7e28bf268a598
MD5 8a4b9c4799f1f3eefc5a9b722a20ec6d
BLAKE2b-256 d9f312a1064d89aed87bdd8d049f8c3bb08d4608556e66b0c1c3a74328968f88

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 5c42c040cf2f79346f8ed6bdf0c4158e96df169c5f8e7902af3df7d495599308
MD5 1d99392f74da8526e46767e8b916c9a2
BLAKE2b-256 bda731b7e9d32e06cd1d371851637fad681813c6247e4f9200319c90f9e003cf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 75e9a1cf4da191b07f1c23dde68c32b0f930dbaf5fa5bebacf98e1df203ba832
MD5 de401814af9bfe84b209fdc5483dda23
BLAKE2b-256 f051c787c110203c2ad4335c2f8ac0dc14b2fbb3c8bc6768c74a41a2473c7ccb

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: sailpy-1.0.1-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.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fdfe165ee8880a3d26c999abe18f9d0455070134d8264b2130680ebe11d45a78
MD5 4056ad1f14f2f527db3af5aa421b0ad1
BLAKE2b-256 1a67e894a2855a5f4f3a140a93ad8b30c134e161fa138f7704a4bf5504d27ef2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 09fb64f482c7cef3909192059bd9241900332ba38142d1629b33812a1ca2d765
MD5 f061660835de3cb9407a2f41d8d61b06
BLAKE2b-256 d53a289f85ade8dbc0034492602e4b2ec24a4cb8c1f614a19cc58f0ff169852b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 28d35cfc5fa2d22b9211de6ec9035dc4a26c139defc3888be016f24868766781
MD5 74a187e37cf9516ba820d53f3f4b072c
BLAKE2b-256 38a21ce07c18b7e968ab01a879709839c7744d60de8a1392f28c38f9d62dc31c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: sailpy-1.0.1-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.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ff4026dd787cba8c35da649100faf9492230190106f8be153884db7f0e3ada29
MD5 e71d39ee667b9f293a7f6b0ad0cbab4d
BLAKE2b-256 f8ba029591d9ed619c63d236ca2e50a5d1bfdc5fc017787d08d17367f3347afe

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6161b822c1e0a0824bda60f3c8d606ea7ac0909ba575f2708b69d9c6542992b4
MD5 411c441311e89b9c70088550331f78ab
BLAKE2b-256 723222c80a2201e2507abbed23758dfeff7326b1836b2a3c7c7915630bd807d4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 5ff9386840784ad4d4fae197c32df96a20abc4669078b727b528976147c779e2
MD5 9661ea4ad3ba5a5200543812ea610c91
BLAKE2b-256 7f70790d02a23816fc13367cd1b0095c1624cf366222e84709d3a66b09228905

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: sailpy-1.0.1-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.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 57dc4293252d83cf82f39b105db056263630f4bfc2b6807653dfa838b438942c
MD5 bb72039c0474986b8e95f35f2d2929f5
BLAKE2b-256 e92ac3d5a7d3915f288ece3d01fdf2260362d3c4435c2f6e663fecae10f13ac9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b99edfa7f841b79ffd9c4744646eb517416f43eb0a80bbeba9b2cebe2e4374fc
MD5 0de93374be60fdbf355ff22af1781af3
BLAKE2b-256 fc85a4d657e96d72146b21796f6decb11f9cb9c48f4253c3fae8e83a882af33f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sailpy-1.0.1-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 eeb039717880d01054622cded791899834f835ba49d5f1f55166acd874a34d9f
MD5 89149350f974d0a38260946105a0e824
BLAKE2b-256 bbca84b6fb09cdfe53a26a61fcf5351dfc820b963343f31101f6624587bb6005

See more details on using hashes here.

Provenance

The following attestation bundles were made for sailpy-1.0.1-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