Serc
An experimental CPython bytecode compiler, written in Rust.
Highlights
- Compile Python source to CPython
.pycfiles without a CPython installation. - Target Python 3.12, 3.13, 3.14, and 3.15 with a single executable.
- Check source files and recursively compile packages from the command line.
- Embed the compiler via the Rust library.
Serc produces byte-for-byte identical output on an extensive corpus of real-world Python code, including Django, Airflow, and Transformers, >40% faster than CPython's built-in compiler:
| Project | Serc | CPython 3.14.5 compileall |
Speedup |
|---|---|---|---|
| NumPy 2.4.6 (505 files) | 1.194 s ± 0.023 s | 1.739 s ± 0.060 s | 1.46× |
But Serc is also experimental! And so may emit incorrect bytecode in some cases.
Installation
Install from crates.io with Rust 1.96 or later:
cargo install serc-cli --locked
Getting started
Given hello.py:
def greet(name):
return f"Hello, {name}!"
Compile it to bytecode, emitted at __pycache__/hello.cpython-314.pyc:
serc compile hello.py
Pass a directory to compile its Python files recursively, or use --check to
compile without writing cache files:
serc compile path/to/package
serc compile --check path/to/package
Compilation uses the available CPUs by default. Use --jobs (or -j) to set a
limit, including --jobs 1 for serial compilation. You can also set the default
with RAYON_NUM_THREADS:
serc compile --jobs 4 path/to/package
Python version
Serc emits Python 3.14-compatible bytecode by default, but supports target
selection with --python-version. For example, to emit Python 3.15 bytecode:
serc compile --python-version 3.15 path/to/package
Serc supports the following CPython minor versions:
| Target | Pinned CPython release |
|---|---|
3.12 |
3.12.14 |
3.13 |
3.13.15 |
3.14 |
3.14.5 |
3.15 |
3.15.0rc2 |
Each target writes its own cache tag and bytecode magic number, so the four
versions can coexist under __pycache__.
Optimization
Use -O to remove assertions and set __debug__ to false, matching Python's
-O mode. Use -OO to additionally remove module, class, and function
docstrings:
serc compile -O hello.py
serc compile -OO hello.py
You can also select the level explicitly with --optimize 0, --optimize 1, or
--optimize 2. Level 0 is the default. Optimized caches use Python's naming
convention, such as __pycache__/hello.cpython-314.opt-1.pyc and
__pycache__/hello.cpython-314.opt-2.pyc, so all three levels can coexist.
Rust library
Add Serc to your Cargo.toml:
[dependencies]
serc = "0.1.0"
Compile Python source and serialize the resulting code object in CPython's marshal format:
let module = serc::compile("print('Hello, world!')\n", "hello.py").unwrap();
let marshaled = module.marshal();
Compilation defaults to Python 3.14. See the
library guide for selecting another Python
version and generating .pyc files.
License
Serc is licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Serc by you, as defined in the Apache-2.0 license, shall be dually licensed as above, without any additional terms or conditions.
Metadata
Release files for serc 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| serc-0.1.6.tar.gz | 2.8 MB | Without provenance | Details |
Built distributions (wheels)
Total release size: 96.7 MB
Release files / serc-0.1.6.tar.gz
| Download URL | serc-0.1.6.tar.gz |
|---|---|
| Size | 2.8 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eb06e7b7b8dc822b26f96b0d90a6dab1e500ff403cad03ebd17cb25d709219d2
|
|
BLAKE2b-256 checksum How to use checksums |
2539503a505c91b073ad15817e8786a66e4c6c9425cbc4efd22f2c0006ae1caf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-win_arm64.whl
| Download URL | serc-0.1.6-py3-none-win_arm64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | Python 3 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
db1ff1c0ade75edf41ea7e336544c44b27f45766e86b4aa6bc3fb4504a03825f
|
|
BLAKE2b-256 checksum How to use checksums |
a4a8ab2e765a3980610e8c1ea153c015ee6070538a32c10dcc6a649f4d077795
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-win_amd64.whl
| Download URL | serc-0.1.6-py3-none-win_amd64.whl |
|---|---|
| Size | 6.0 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
5f1ccd50d20cb70c515d609f219def3dda747f1d9e4d43fa12a82e457153502e
|
|
BLAKE2b-256 checksum How to use checksums |
19772aae44ccb74af4ebd93bc35207799c5327ce15c30effa3de6d4f270dca9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-win32.whl
| Download URL | serc-0.1.6-py3-none-win32.whl |
|---|---|
| Size | 4.9 MB |
| Tags | Python 3 Windows x86-32 |
|
SHA-256 checksum How to use checksums |
6ce9f35a9b102ebc4ac3e4db3b7ef912737638f9d5204c99087083495333222a
|
|
BLAKE2b-256 checksum How to use checksums |
9f7f4fa0ab48facbb247935ef2e6dadb551dbbdf237b3494e4329525e1ef4fc8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-musllinux_1_1_x86_64.whl
| Download URL | serc-0.1.6-py3-none-musllinux_1_1_x86_64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | Linux musl 1.1+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
31a6560b37b69901d38ccbd911dc7aa7b575bb08e7d9a48e51b8dea4dc9c2fe7
|
|
BLAKE2b-256 checksum How to use checksums |
d577a3ffe326b87adb930b87318eca0de414b2b7fd4b4df231c483b938cfa7f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-musllinux_1_1_riscv64.whl
| Download URL | serc-0.1.6-py3-none-musllinux_1_1_riscv64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | Linux musl 1.1+ RISC-V 64 Python 3 |
|
SHA-256 checksum How to use checksums |
1b21914c9f8b3c69086e2309f73a7e8c0ac0917319127b6fa77e602c5f20dadf
|
|
BLAKE2b-256 checksum How to use checksums |
bc217c0574e2b020d07b8227e43d5c6a26196d12d7b4ccc02137ed8a940cce73
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-musllinux_1_1_i686.whl
| Download URL | serc-0.1.6-py3-none-musllinux_1_1_i686.whl |
|---|---|
| Size | 5.0 MB |
| Tags | Linux musl 1.1+ x86-32 Python 3 |
|
SHA-256 checksum How to use checksums |
93bd98d2289c10a9064db72ebf4ba1c376c1ca8f3ac64f1a647fb99dfac9b84f
|
|
BLAKE2b-256 checksum How to use checksums |
fabb43882de8947dbccaa29ed3a33d963c9a907123f10b43c3f6202a1cceb6bc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-musllinux_1_1_armv7l.whl
| Download URL | serc-0.1.6-py3-none-musllinux_1_1_armv7l.whl |
|---|---|
| Size | 4.9 MB |
| Tags | Linux musl 1.1+ ARMv7l Python 3 |
|
SHA-256 checksum How to use checksums |
152d5d47c8ca32257679f4f732143041b6c530b026a1cbba94a179f925dc7671
|
|
BLAKE2b-256 checksum How to use checksums |
2000a5af4e04e7cac287ff5459fd4bbc4af945e31b326dfb37b52db4e8a7392e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-musllinux_1_1_aarch64.whl
| Download URL | serc-0.1.6-py3-none-musllinux_1_1_aarch64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | Linux musl 1.1+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
3f2608f33b93406e3fa29742a76a01bd654ba02ff14a9213fd31d5cd13e9b1b0
|
|
BLAKE2b-256 checksum How to use checksums |
8cea37a034c3666e406061024d561e609c99c132cc3b1ac357a8f4bf6f7f1689
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-manylinux_2_31_riscv64.whl
| Download URL | serc-0.1.6-py3-none-manylinux_2_31_riscv64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | Linux glibc 2.31+ RISC-V 64 Python 3 |
|
SHA-256 checksum How to use checksums |
b427f178a5432667faa4e6da88ebccc890b6d46edc39acc3f23d790d09743a67
|
|
BLAKE2b-256 checksum How to use checksums |
fce42eb884eb812286d68c2396a57ae8899732b43abf62a5c4b1deef528ab2fe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-manylinux_2_28_aarch64.whl
| Download URL | serc-0.1.6-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 5.7 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
12c666d843cabcf31e73ff06f61062957679d520222f07f44c937d08f9bfd1a4
|
|
BLAKE2b-256 checksum How to use checksums |
04a5aaeebc306ea74c79e9ca7d883eefff52250b75d2016842b2664f89be6053
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | serc-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 6.0 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
2fcc3ac158d4fd22a989a785cc38ec634a6d3b72e804c2463b96762ddd657784
|
|
BLAKE2b-256 checksum How to use checksums |
2dabff2a36a98de2ab1cca7749c0672419123b9c87ac865d8d9b8e7616253507
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
| Download URL | serc-0.1.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl |
|---|---|
| Size | 5.6 MB |
| Tags | Linux glibc 2.17+ IBM System/390x Python 3 |
|
SHA-256 checksum How to use checksums |
8852dc0e0f833f534733084278ae5c301a18118e3954272ca19102f6b8a763e6
|
|
BLAKE2b-256 checksum How to use checksums |
a5113943bc2ed04a332b55331d3f5458b8bd7fc3289e68ac62da844b47aadbd6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
| Download URL | serc-0.1.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl |
|---|---|
| Size | 5.5 MB |
| Tags | Linux glibc 2.17+ PowerPC 64-le Python 3 |
|
SHA-256 checksum How to use checksums |
21e29f0bdc1caea7ae5ae9e637d8a529f89c35da27eeee1e6d06927cd194c5d5
|
|
BLAKE2b-256 checksum How to use checksums |
549f415ff96fd1939f246607585813fbfd2a81c65706d4b3be34cd3c5227d41e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
| Download URL | serc-0.1.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl |
|---|---|
| Size | 5.1 MB |
| Tags | Linux glibc 2.17+ x86-32 Python 3 |
|
SHA-256 checksum How to use checksums |
972080387af0d064f810473c35997bce846c80453a8ec92b6d62a8b4a45fbefe
|
|
BLAKE2b-256 checksum How to use checksums |
66487f5cd83b80a727d8920a934febf860bb33eb0fd718130d63821dbbe6bb3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
| Download URL | serc-0.1.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl |
|---|---|
| Size | 4.8 MB |
| Tags | Linux glibc 2.17+ ARMv7l Python 3 |
|
SHA-256 checksum How to use checksums |
8190a6b6caebb4d5064d4bee30ef5fa46a9fa73bb4ded2942130d730794d3a5a
|
|
BLAKE2b-256 checksum How to use checksums |
e7e8596e46c58f509e915c570c0b5a23f7862a1b23cbdb2c4bf75ba174322019
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-macosx_11_0_arm64.whl
| Download URL | serc-0.1.6-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.5 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
bf472c8bd2b64e9dedddacfb39e0049d688dbcf02ff2b21bb5fc68eaf0016137
|
|
BLAKE2b-256 checksum How to use checksums |
15e6b701d9a58dc4ec23132e5783c460c00304cd32a5f0daf521cce025081c5e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-macosx_10_12_x86_64.whl
| Download URL | serc-0.1.6-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 4.9 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
f3c7c989335e82b302d302c5ae47689b9ca7fce24b34305efc2cfe03a7dec75c
|
|
BLAKE2b-256 checksum How to use checksums |
b7b96765ac4a24a629ccd9c8c708d0768c2546713fa02a8d4b2a4cb1db4532bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.6-py3-none-linux_armv6l.whl
| Download URL | serc-0.1.6-py3-none-linux_armv6l.whl |
|---|---|
| Size | 5.0 MB |
| Tags | Python 3 linux armv6l |
|
SHA-256 checksum How to use checksums |
2e69f1eed8c8c72fad789ee04230dc7aa7cdc2d8a4a7a3a757070573cf45decb
|
|
BLAKE2b-256 checksum How to use checksums |
4430f4cce10cb725335b2c8fe376a969aa6473f890f30da2c9983df88a0253ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for serc 0.1.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.