readme: recommend maturin init
This commit is contained in:
parent
770c02e93c
commit
6ffa508ad3
57
README.md
57
README.md
|
@ -24,15 +24,34 @@ You can use PyO3 to write a native Python module in Rust, or to embed Python in
|
||||||
|
|
||||||
### Using Rust from Python
|
### Using Rust from Python
|
||||||
|
|
||||||
PyO3 can be used to generate a native Python module. The easiest way to try this out for the first time is to use [`maturin`](https://github.com/PyO3/maturin). `maturin` is a tool for building and publishing Rust-based Python packages with minimal configuration. The following steps set up some files for an example Python module, install `maturin`, and then show how build and import the Python module.
|
PyO3 can be used to generate a native Python module. The easiest way to try this out for the first time is to use [`maturin`](https://github.com/PyO3/maturin). `maturin` is a tool for building and publishing Rust-based Python packages with minimal configuration. The following steps install `maturin`, use it to generate and build a new Python package, and then launch Python to import and execute a function from the package.
|
||||||
|
|
||||||
First, create a new folder (let's call it `string_sum`) containing the following two files:
|
First, follow the commands below to create a new directory containing a new Python `virtualenv`, and install `maturin` into the virtualenv using Python's package manager, `pip`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# (replace string_sum with the desired package name)
|
||||||
|
$ mkdir string_sum
|
||||||
|
$ cd string_sum
|
||||||
|
$ python -m venv .env
|
||||||
|
$ source .env/bin/activate
|
||||||
|
$ pip install maturin
|
||||||
|
```
|
||||||
|
|
||||||
|
Still inside this `string_sum` directory, now run `maturin init`. This will generate the new package source. When given the choice of bindings to use, select pyo3 bindings:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ maturin init
|
||||||
|
✔ 🤷 What kind of bindings to use? · pyo3
|
||||||
|
✨ Done! New project created string_sum
|
||||||
|
```
|
||||||
|
|
||||||
|
The most important files generated by this command are `Cargo.toml` and `lib.rs`, which will look roughly like the following:
|
||||||
|
|
||||||
**`Cargo.toml`**
|
**`Cargo.toml`**
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[package]
|
[package]
|
||||||
name = "string-sum"
|
name = "string_sum"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
|
@ -45,9 +64,8 @@ name = "string_sum"
|
||||||
# crate-type = ["cdylib", "rlib"]
|
# crate-type = ["cdylib", "rlib"]
|
||||||
crate-type = ["cdylib"]
|
crate-type = ["cdylib"]
|
||||||
|
|
||||||
[dependencies.pyo3]
|
[dependencies]
|
||||||
version = "0.15.1"
|
pyo3 = { version = "0.15.1", features = ["extension-module"] }
|
||||||
features = ["extension-module"]
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**`src/lib.rs`**
|
**`src/lib.rs`**
|
||||||
|
@ -67,21 +85,11 @@ fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
|
||||||
#[pymodule]
|
#[pymodule]
|
||||||
fn string_sum(_py: Python, m: &PyModule) -> PyResult<()> {
|
fn string_sum(_py: Python, m: &PyModule) -> PyResult<()> {
|
||||||
m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
|
m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
With those two files in place, now `maturin` needs to be installed. This can be done using Python's package manager `pip`. First, load up a new Python `virtualenv`, and install `maturin` into it:
|
Finally, run `maturin develop`. This will build the package and install it into the Python virtualenv previously created and activated. The package is then ready to be used from `python`:
|
||||||
|
|
||||||
```bash
|
|
||||||
$ cd string_sum
|
|
||||||
$ python -m venv .env
|
|
||||||
$ source .env/bin/activate
|
|
||||||
$ pip install maturin
|
|
||||||
```
|
|
||||||
|
|
||||||
Now build and execute the module:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ maturin develop
|
$ maturin develop
|
||||||
|
@ -92,7 +100,20 @@ $ python
|
||||||
'25'
|
'25'
|
||||||
```
|
```
|
||||||
|
|
||||||
As well as with `maturin`, it is possible to build using [`setuptools-rust`](https://github.com/PyO3/setuptools-rust) or [manually](https://pyo3.rs/latest/building_and_distribution.html#manual-builds). Both offer more flexibility than `maturin` but require further configuration.
|
To make changes to the package, just edit the Rust source code and then re-run `maturin develop` to recompile.
|
||||||
|
|
||||||
|
To run this all as a single copy-and-paste, use the bash script below (replace `string_sum` in the first command with the desired package name):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir string_sum && cd "$_"
|
||||||
|
python -m venv .env
|
||||||
|
source .env/bin/activate
|
||||||
|
pip install maturin
|
||||||
|
maturin init --bindings pyo3
|
||||||
|
maturin develop
|
||||||
|
```
|
||||||
|
|
||||||
|
As well as with `maturin`, it is possible to build using [`setuptools-rust`](https://github.com/PyO3/setuptools-rust) or [manually](https://pyo3.rs/latest/building_and_distribution.html#manual-builds). Both offer more flexibility than `maturin` but require more configuration to get started.
|
||||||
|
|
||||||
### Using Python from Rust
|
### Using Python from Rust
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue