2018-05-17 21:59:11 +00:00
# PyO3
2015-04-19 03:29:19 +00:00
2021-03-28 20:56:10 +00:00
[![actions status ](https://github.com/PyO3/pyo3/workflows/CI/badge.svg )](https://github.com/PyO3/pyo3/actions)
2021-03-16 22:14:57 +00:00
[![codecov ](https://codecov.io/gh/PyO3/pyo3/branch/main/graph/badge.svg )](https://codecov.io/gh/PyO3/pyo3)
2021-04-03 08:39:50 +00:00
[![crates.io ](https://meritbadge.herokuapp.com/pyo3 )](https://crates.io/crates/pyo3)
2021-02-10 15:07:25 +00:00
[![minimum rustc 1.41 ](https://img.shields.io/badge/rustc-1.41+-blue.svg )](https://rust-lang.github.io/rfcs/2495-min-rust-version.html)
2021-03-28 20:56:10 +00:00
[![dev chat ](https://img.shields.io/gitter/room/nwjs/nw.js.svg )](https://gitter.im/PyO3/Lobby)
2021-04-03 08:39:50 +00:00
[![contributing notes ](https://img.shields.io/badge/contribute-on%20github-Green )](https://github.com/PyO3/pyo3/blob/main/Contributing.md)
2018-05-17 21:59:11 +00:00
2021-04-03 08:39:50 +00:00
[Rust ](http://www.rust-lang.org/ ) bindings for [Python ](https://www.python.org/ ), including tools for creating native Python extension modules. Running and interacting with Python code from a Rust binary is also supported.
2015-04-19 03:29:19 +00:00
2021-03-16 22:14:57 +00:00
* User Guide: [stable ](https://pyo3.rs ) | [main ](https://pyo3.rs/main )
2015-04-19 03:29:19 +00:00
2021-03-16 22:14:57 +00:00
* API Documentation: [stable ](https://docs.rs/pyo3/ ) | [main ](https://pyo3.rs/main/doc )
2018-10-04 06:46:15 +00:00
2018-05-17 21:59:11 +00:00
## Usage
2017-05-21 12:37:56 +00:00
2021-02-10 15:07:25 +00:00
PyO3 supports Python 3.6 and up. The minimum required Rust version is 1.41.
2019-11-23 06:29:39 +00:00
2021-04-02 09:39:47 +00:00
PyPy is also supported. Some minor features are unavailable on PyPy - please refer to the [pypy section in the guide ](https://pyo3.rs/main/building_and_distribution/pypy.html ) for more information.
2019-04-23 11:18:42 +00:00
2019-05-07 18:57:43 +00:00
You can either write a native Python module in Rust, or use Python from a Rust binary.
2015-04-19 03:29:19 +00:00
2019-04-09 09:56:03 +00:00
However, on some OSs, you need some additional packages. E.g. if you are on *Ubuntu 18.04* , please run
2018-11-26 04:31:49 +00:00
```bash
sudo apt install python3-dev python-dev
```
2019-04-09 09:56:03 +00:00
## Using Rust from Python
2015-04-19 03:29:19 +00:00
2019-05-07 18:57:43 +00:00
PyO3 can be used to generate a native Python module.
2017-10-22 03:17:35 +00:00
2019-02-01 13:01:18 +00:00
**`Cargo.toml`**
2017-05-21 12:37:56 +00:00
2016-10-26 19:46:22 +00:00
```toml
2018-06-02 23:01:40 +00:00
[package]
2018-08-30 21:19:23 +00:00
name = "string-sum"
2018-06-02 23:01:40 +00:00
version = "0.1.0"
2019-02-01 13:01:18 +00:00
edition = "2018"
2018-06-02 23:01:40 +00:00
2016-10-26 19:46:22 +00:00
[lib]
2018-08-30 21:19:23 +00:00
name = "string_sum"
2020-12-22 10:20:52 +00:00
# "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"]
2016-12-17 20:41:14 +00:00
crate-type = ["cdylib"]
2016-10-26 19:46:22 +00:00
2017-05-19 04:35:08 +00:00
[dependencies.pyo3]
2021-01-24 11:39:17 +00:00
version = "0.13.2"
2016-12-17 20:41:14 +00:00
features = ["extension-module"]
2016-10-26 19:46:22 +00:00
```
**`src/lib.rs`**
2017-05-21 12:37:56 +00:00
2016-10-26 19:46:22 +00:00
```rust
2018-07-30 20:52:22 +00:00
use pyo3::prelude::*;
2019-02-01 13:01:18 +00:00
use pyo3::wrap_pyfunction;
2018-07-18 11:08:05 +00:00
2020-06-06 22:21:56 +00:00
/// Formats the sum of two numbers as string.
2020-06-07 12:06:15 +00:00
#[pyfunction]
2018-07-30 20:52:22 +00:00
fn sum_as_string(a: usize, b: usize) -> PyResult< String > {
Ok((a + b).to_string())
}
2018-05-01 13:31:11 +00:00
2020-06-06 22:21:56 +00:00
/// A Python module implemented in Rust.
2020-06-07 12:06:15 +00:00
#[pymodule]
2018-08-30 21:19:23 +00:00
fn string_sum(py: Python, m: & PyModule) -> PyResult< ()> {
2020-09-09 09:53:24 +00:00
m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
2017-06-14 21:08:30 +00:00
2016-10-26 19:46:22 +00:00
Ok(())
2017-06-12 06:57:21 +00:00
}
2016-10-26 19:46:22 +00:00
```
2017-03-12 11:54:21 +00:00
2020-06-06 22:21:56 +00:00
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` .
2018-06-02 23:01:40 +00:00
2021-03-16 22:14:57 +00:00
To build, test and publish your crate as a Python module, you can use [maturin ](https://github.com/PyO3/maturin ) or [setuptools-rust ](https://github.com/PyO3/setuptools-rust ). You can find an example for setuptools-rust in [examples/word-count ](https://github.com/PyO3/pyo3/tree/main/examples/word-count ), while maturin should work on your crate without any configuration.
2017-05-13 05:51:14 +00:00
2019-05-07 18:57:43 +00:00
## Using Python from Rust
2018-07-30 20:52:22 +00:00
2020-06-06 22:21:56 +00:00
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:
2018-07-30 20:52:22 +00:00
```toml
2020-12-28 16:02:57 +00:00
[dependencies.pyo3]
2021-01-24 11:39:17 +00:00
version = "0.13.2"
2020-12-28 16:02:57 +00:00
features = ["auto-initialize"]
2018-07-30 20:52:22 +00:00
```
2019-05-07 18:57:43 +00:00
Example program displaying the value of `sys.version` and the current user name:
2018-07-30 20:52:22 +00:00
```rust
use pyo3::prelude::*;
2019-03-20 18:37:27 +00:00
use pyo3::types::IntoPyDict;
2018-07-30 20:52:22 +00:00
2019-09-15 10:55:01 +00:00
fn main() -> Result< (), ()> {
2020-07-13 21:37:40 +00:00
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);
})
2019-09-15 10:55:01 +00:00
})
}
fn main_(py: Python) -> PyResult< ()> {
2018-07-30 20:52:22 +00:00
let sys = py.import("sys")?;
let version: String = sys.get("version")?.extract()?;
2019-03-20 18:37:27 +00:00
let locals = [("os", py.import("os")?)].into_py_dict(py);
2019-02-01 13:01:18 +00:00
let code = "os.getenv('USER') or os.getenv('USERNAME') or 'Unknown'";
let user: String = py.eval(code, None, Some(&locals))?.extract()?;
2018-07-30 20:52:22 +00:00
println!("Hello {}, I'm Python {}", user, version);
Ok(())
}
```
2021-03-16 22:14:57 +00:00
Our guide has [a section ](https://pyo3.rs/main/python_from_rust.html ) with lots of examples
2019-09-23 12:28:52 +00:00
about this topic.
2019-09-15 10:55:01 +00:00
2020-04-02 13:16:58 +00:00
## Tools and libraries
* [maturin ](https://github.com/PyO3/maturin ) _Zero configuration build tool for Rust-made Python extensions_ .
* [setuptools-rust ](https://github.com/PyO3/setuptools-rust ) _Setuptools plugin for Rust support_ .
2020-09-15 21:33:30 +00:00
* [pyo3-built ](https://github.com/PyO3/pyo3-built ) _Simple macro to expose metadata obtained with the [`built`](https://crates.io/crates/built) crate as a [`PyDict`](https://docs.rs/pyo3/0.12.0/pyo3/types/struct.PyDict.html)_
2020-04-02 13:16:58 +00:00
* [rust-numpy ](https://github.com/PyO3/rust-numpy ) _Rust binding of NumPy C-API_
* [dict-derive ](https://github.com/gperinazzo/dict-derive ) _Derive FromPyObject to automatically transform Python dicts into Rust structs_
2020-07-19 06:37:10 +00:00
* [pyo3-log ](https://github.com/vorner/pyo3-log ) _Bridge from Rust to Python logging_
2020-11-24 19:48:08 +00:00
* [pythonize ](https://github.com/davidhewitt/pythonize ) _Serde serializer for converting Rust objects to JSON-compatible Python objects_
2021-01-23 17:02:01 +00:00
* [pyo3-asyncio ](https://github.com/awestlake87/pyo3-asyncio ) Utilities for working with Python's Asyncio library and async functions
2020-04-02 13:16:58 +00:00
## Examples
2018-07-30 20:52:22 +00:00
* [hyperjson ](https://github.com/mre/hyperjson ) _A hyper-fast Python module for reading/writing JSON data using Rust's serde-json_
2021-03-16 22:14:57 +00:00
* [html-py-ever ](https://github.com/PyO3/setuptools-rust/tree/main/examples/html-py-ever ) _Using [html5ever](https://github.com/servo/html5ever) through [kuchiki](https://github.com/kuchiki-rs/kuchiki) to speed up html parsing and css-selecting._
2018-08-11 15:35:03 +00:00
* [point-process ](https://github.com/ManifoldFR/point-process-rust/tree/master/pylib ) _High level API for pointprocesses as a Python library_
2018-11-23 19:28:36 +00:00
* [autopy ](https://github.com/autopilot-rs/autopy ) _A simple, cross-platform GUI automation library for Python and Rust._
2019-06-05 06:51:25 +00:00
* Contains an example of building wheels on TravisCI and appveyor using [cibuildwheel ](https://github.com/joerick/cibuildwheel )
2018-11-23 19:28:36 +00:00
* [orjson ](https://github.com/ijl/orjson ) _Fast Python JSON library_
2019-05-12 12:41:01 +00:00
* [inline-python ](https://github.com/dronesforwork/inline-python ) _Inline Python code directly in your Rust code_
2019-06-08 14:35:24 +00:00
* [Rogue-Gym ](https://github.com/kngwyu/rogue-gym ) _Customizable rogue-like game for AI experiments_
2019-06-05 06:51:25 +00:00
* Contains an example of building wheels on Azure Pipelines
2019-06-05 17:54:26 +00:00
* [fastuuid ](https://github.com/thedrow/fastuuid/ ) _Python bindings to Rust's UUID library_
2020-09-16 08:57:46 +00:00
* [wasmer-python ](https://github.com/wasmerio/wasmer-python ) _Python library to run WebAssembly binaries_
2020-02-12 16:19:40 +00:00
* [mocpy ](https://github.com/cds-astro/mocpy ) _Astronomical Python library offering data structures for describing any arbitrary coverage regions on the unit sphere_
2020-02-13 22:13:28 +00:00
* [tokenizers ](https://github.com/huggingface/tokenizers/tree/master/bindings/python ) _Python bindings to the Hugging Face tokenizers (NLP) written in Rust_
2020-10-18 09:14:06 +00:00
* [pyre ](https://github.com/Project-Dream-Weaver/Pyre ) _Fast Python HTTP server written in Rust_
2021-01-29 19:28:29 +00:00
* [jsonschema-rs ](https://github.com/Stranger6667/jsonschema-rs/tree/master/bindings/python ) _Fast JSON Schema validation library_
2021-01-31 11:16:18 +00:00
* [css-inline ](https://github.com/Stranger6667/css-inline/tree/master/bindings/python ) _CSS inlining for Python implemented in Rust_
2021-03-16 22:14:57 +00:00
* [cryptography ](https://github.com/pyca/cryptography/tree/main/src/rust ) _Python cryptography library with some functionality in Rust_
2021-03-03 05:06:30 +00:00
* [polaroid ](https://github.com/daggy1234/polaroid ) _Hyper Fast and safe image manipulation library for Python written in Rust_
2018-07-30 20:52:22 +00:00
2021-04-03 08:39:50 +00:00
## Contributing
Everyone is welcomed to contribute to PyO3! There are many ways to support the project, such as:
- help PyO3 users with issues on Github and Gitter
- improve documentation
- write features and bugfixes
- publish blogs and examples of how to use PyO3
Our [contributing notes ](https://github.com/PyO3/pyo3/blob/main/Contributing.md ) and [architecture guide ](https://github.com/PyO3/pyo3/blob/master/Architecture.md ) have more resources if you wish to volunteer time for PyO3 and are searching where to start.
If you don't have time to contribute yourself but still wish to support the project's future success, some of our maintainers have Github sponsorship pages:
* [davidhewitt ](https://github.com/sponsors/davidhewitt )
2018-05-17 21:59:11 +00:00
## License
2017-05-13 05:51:14 +00:00
2018-05-17 21:59:11 +00:00
PyO3 is licensed under the [Apache-2.0 license ](http://opensource.org/licenses/APACHE-2.0 ).
2018-06-14 08:10:39 +00:00
Python is licensed under the [Python License ](https://docs.python.org/2/license.html ).