https://github.com/PyO3/pyo3 Skip to content Sign up * Why GitHub? Features - + Mobile - + Actions - + Codespaces - + Packages - + Security - + Code review - + Project management - + Integrations - + GitHub Sponsors - + Customer stories - + Security - * Team * Enterprise * Explore + Explore GitHub - Learn & contribute + Topics - + Collections - + Trending - + Learning Lab - + Open source guides - Connect with others + The ReadME Project - + Events - + Community forum - + GitHub Education - + GitHub Stars program - * Marketplace * Pricing Plans - + Compare plans - + Contact Sales - + Nonprofit - + Education - [ ] [search-key] * # In this repository All GitHub | Jump to | * No suggested jump to results * # In this repository All GitHub | Jump to | * # In this organization All GitHub | Jump to | * # In this repository All GitHub | Jump to | Sign in Sign up {{ message }} PyO3 / pyo3 * Watch 63 * Star 3.6k * Fork 235 Rust bindings for the Python interpreter pyo3.rs View license 3.6k stars 235 forks Star Watch * Code * Issues 97 * Pull requests 15 * Actions * Security * Insights More * Code * Issues * Pull requests * Actions * Security * Insights master 55 branches 50 tags Go to file Code Clone HTTPS GitHub CLI [https://github.com/P] Use Git or checkout with SVN using the web URL. [gh repo clone PyO3/p] Work fast with our official CLI. Learn more. * Open with GitHub Desktop * Download ZIP Launching GitHub Desktop If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode If nothing happens, download Xcode and try again. Go back Launching Visual Studio If nothing happens, download the GitHub extension for Visual Studio and try again. Go back Latest commit @kngwyu kngwyu Merge pull request #1401 from davidhewitt/more-guide-sublevels ... e9cb69b Jan 27, 2021 Merge pull request #1401 from davidhewitt/more-guide-sublevels guide: organise more chapters into sublevels e9cb69b Git stats * 2,917 commits Files Permalink Failed to load latest commit information. Type Name Latest commit message Commit time .github implement Serialize, Deserialize for Py Jan 11, 2021 benches benches: add map / set extraction Nov 26, 2020 examples ci: deny clippy warnings for examples Dec 31, 2020 guide guide: organise more chapters into sublevels Jan 26, 2021 pyo3-macros-backend pyproto: small refactoring to backend macro Jan 15, 2021 pyo3-macros Merge pull request #1374 from davidhewitt/macros-error-handling Jan 12, 2021 src Merge pull request #1401 from davidhewitt/more-guide-sublevels Jan 27, 2021 tests macros-backend: fix raw idents in pymethods Jan 12, 2021 .gitignore Some api improvements Feb 23, 2019 CHANGELOG.md build: fix support for non-utf8 systems Jan 26, 2021 Cargo.toml implement Serialize, Deserialize for Py Jan 11, 2021 Code-of-Conduct.md Remove myself from the CoC Apr 13, 2020 Contributing.md ci: deny warnings using RUSTFLAGS Dec 26, 2020 LICENSE Rename LICENSE-APACHE to LICENSE Oct 4, 2017 Makefile implement Serialize, Deserialize for Py Jan 11, 2021 README.md release: 0.13.1 Jan 10, 2021 build.rs build: fix support for non-utf8 systems Jan 26, 2021 codecov.yml Allow tiny coverage drop in PR to reduce "failure" noise Sep 2, 2020 pyproject.toml Format examples with black (#590) Sep 5, 2019 tox.ini Add Python 3.8 to CI Feb 1, 2020 View code README.md PyO3 Actions Status codecov crates.io minimum rustc 1.45 Join the dev chat Rust bindings for Python. This includes running and interacting with Python code from a Rust binary, as well as writing native Python modules. * User Guide: stable | master * API Documentation: stable | master * Contributing Notes: github A comparison with rust-cpython can be found in the guide. Usage PyO3 supports Python 3.6 and up. The minimum required Rust version is 1.45.0. Building with PyPy is also possible (via cpyext) for Python 3.6, targeted PyPy version is 7.3+. Please refer to the pypy section in the guide. You can either write a native Python module in Rust, or use Python from a Rust binary. However, on some OSs, you need some additional packages. E.g. if you are on Ubuntu 18.04, please run sudo apt install python3-dev python-dev Using Rust from Python PyO3 can be used to generate a native Python module. Cargo.toml [package] name = "string-sum" version = "0.1.0" edition = "2018" [lib] name = "string_sum" # "cdylib" is necessary to produce a shared library for Python to import from. # # Downstream Rust code (including code in `bin/`, `examples/`, and `tests/`) will not be able # to `use string_sum;` unless the "rlib" or "lib" crate type is also included, e.g.: # crate-type = ["cdylib", "rlib"] crate-type = ["cdylib"] [dependencies.pyo3] version = "0.13.1" features = ["extension-module"] src/lib.rs use pyo3::prelude::*; use pyo3::wrap_pyfunction; /// Formats the sum of two numbers as string. #[pyfunction] fn sum_as_string(a: usize, b: usize) -> PyResult { Ok((a + b).to_string()) } /// A Python module implemented in Rust. #[pymodule] fn string_sum(py: Python, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(sum_as_string, m)?)?; Ok(()) } On Windows and Linux, you can build normally with cargo build --release. On macOS, you need to set additional linker arguments. One option is to compile with cargo rustc --release -- -C link-arg= -undefined -C link-arg=dynamic_lookup, the other is to create a .cargo/config with the following content: [target.x86_64-apple-darwin] rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ] [target.aarch64-apple-darwin] rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ] While developing, you can symlink (or copy) and rename the shared library from the target folder: On MacOS, rename libstring_sum.dylib to string_sum.so, on Windows libstring_sum.dll to string_sum.pyd, and on Linux libstring_sum.so to string_sum.so. Then open a Python shell in the same folder and you'll be able to import string_sum. To build, test and publish your crate as a Python module, you can use maturin or setuptools-rust. You can find an example for setuptools-rust in examples/word-count, while maturin should work on your crate without any configuration. Using Python from Rust If you want your Rust application to create a Python interpreter internally and use it to run Python code, add pyo3 to your Cargo.toml like this: [dependencies.pyo3] version = "0.13.1" features = ["auto-initialize"] Example program displaying the value of sys.version and the current user name: use pyo3::prelude::*; use pyo3::types::IntoPyDict; fn main() -> Result<(), ()> { Python::with_gil(|py| { main_(py).map_err(|e| { // We can't display Python exceptions via std::fmt::Display, // so print the error here manually. e.print_and_set_sys_last_vars(py); }) }) } fn main_(py: Python) -> PyResult<()> { let sys = py.import("sys")?; let version: String = sys.get("version")?.extract()?; let locals = [("os", py.import("os")?)].into_py_dict(py); let code = "os.getenv('USER') or os.getenv('USERNAME') or 'Unknown'"; let user: String = py.eval(code, None, Some(&locals))?.extract()?; println!("Hello {}, I'm Python {}", user, version); Ok(()) } Our guide has a section with lots of examples about this topic. Tools and libraries * maturin Zero configuration build tool for Rust-made Python extensions. * setuptools-rust Setuptools plugin for Rust support. * pyo3-built Simple macro to expose metadata obtained with the built crate as a PyDict * rust-numpy Rust binding of NumPy C-API * dict-derive Derive FromPyObject to automatically transform Python dicts into Rust structs * pyo3-log Bridge from Rust to Python logging * pythonize Serde serializer for converting Rust objects to JSON-compatible Python objects Examples * hyperjson A hyper-fast Python module for reading/writing JSON data using Rust's serde-json * html-py-ever Using html5ever through kuchiki to speed up html parsing and css-selecting. * point-process High level API for pointprocesses as a Python library * autopy A simple, cross-platform GUI automation library for Python and Rust. + Contains an example of building wheels on TravisCI and appveyor using cibuildwheel * orjson Fast Python JSON library * inline-python Inline Python code directly in your Rust code * Rogue-Gym Customizable rogue-like game for AI experiments + Contains an example of building wheels on Azure Pipelines * fastuuid Python bindings to Rust's UUID library * wasmer-python Python library to run WebAssembly binaries * mocpy Astronomical Python library offering data structures for describing any arbitrary coverage regions on the unit sphere * tokenizers Python bindings to the Hugging Face tokenizers (NLP) written in Rust * pyre Fast Python HTTP server written in Rust * jsonschema-rs Fast JSON Schema validation library * css-inline CSS inlining for Python implemented in Rust License PyO3 is licensed under the Apache-2.0 license. Python is licensed under the Python License. About Rust bindings for the Python interpreter pyo3.rs Topics python rust binding ffi python-c-api Resources Readme License View license Releases 50 PyO3 0.13.1 Latest Jan 10, 2021 + 49 releases Packages 0 No packages published Contributors 118 * @kngwyu * @dgrunwald * @davidhewitt * @konstin * @fafhrd91 * @Alexander-N * @messense * @pganssle * @alex * @birkenfeld * @sebpuetz + 107 contributors Languages * Rust 99.9% * Other 0.1% * (c) 2021 GitHub, Inc. * Terms * Privacy * Security * Status * Docs * Contact GitHub * Pricing * API * Training * Blog * About You can't perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.