s3pypi - S3-backed Python Package Repository

2.0.1 · active · verified Thu Apr 16

s3pypi is a Python command-line interface and library for creating and managing a private Python Package Index hosted in an Amazon S3 bucket. It supports uploading packages (wheels and source distributions), generating `index.html` files, and integrating with `pip`. The current version is `2.0.1`. It maintains an active development pace with releases typically tied to feature enhancements or bug fixes.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates programmatically deploying a dummy Python package to an S3-backed PyPI repository. It requires AWS credentials and an S3 bucket configured in your environment variables. `s3pypi` will automatically pick up credentials from standard AWS locations (environment, shared credentials file).

import os
import shutil
from pathlib import Path
from s3pypi.main import S3PyPI

# 1. Create a temporary directory and a dummy package file
dist_dir = Path("dist_temp_s3pypi")
dist_dir.mkdir(exist_ok=True)
dummy_package_name = "my_dummy_package-1.0.0-py3-none-any.whl"
dummy_package_path = dist_dir / dummy_package_name
dummy_package_path.write_text("This is a dummy package file content.")
print(f"Created dummy package file: {dummy_package_path}")

# 2. Configure S3PyPI using environment variables for AWS credentials
#    Ensure AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION are set in your environment
#    and S3_PYPI_BUCKET points to your target S3 bucket.
aws_region = os.environ.get('AWS_REGION', 'us-east-1')
s3_bucket_name = os.environ.get('S3_PYPI_BUCKET', 'your-s3pypi-bucket-name')

print(f"\nAttempting to deploy package to s3://{s3_bucket_name} in region {aws_region}...")

try:
    s3 = S3PyPI(
        bucket=s3_bucket_name,
        region=aws_region,
        files=[str(dummy_package_path)] # Directly provide the path to the artifact
    )
    s3.deploy() # Use .deploy() as .upload() was removed in v2.0.0
    print(f"Successfully deployed {dummy_package_name} to s3://{s3_bucket_name}.")
except Exception as e:
    print(f"Error deploying package: {e}")
    print("\nEnsure you have configured AWS credentials (e.g., via environment variables, ~/.aws/credentials) ")
    print(f"and that S3 bucket '{s3_bucket_name}' exists and you have write permissions (s3:PutObject, s3:GetObject, s3:ListBucket).")

# 3. Clean up temporary files
shutil.rmtree(dist_dir)
print("Cleaned up temporary files.")

view raw JSON →