Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to specify to pyo3 the virtualenv to use in a rust project?

I need port some python code in my rust project (calling python from rust).

I am writing an app in rust that in a small part needs to import a module written in python.

This is my project structure.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

|...
|extern/python/
|-main.py
|-__init__.py
|src/
|Cargo.toml
|...

I have no problem with executing python code from rust, pyo3’s docs cover this.

But I need specify to pyo3 what virtualenv use to link to my rust crate, almost all of the pyo3’s docs is focused on how to use rust from python and there is very little information about how to use python from rust.

In my python code y use pyenv to isolate the virtualenv, e.g. to run the python code

cd /python/code
pyenv shell my_py_env
python3 main.py

So the thing is, how can I tell to pyo3 to use "my_py_env" when linking the python module?

>Solution :

To specify which virtual environment pyo3 should use when importing a Python module in your Rust project, you can use the PYTHONHOME and PYTHONPATH environment variables.

Here is an example of how you might set these environment variables in your Rust code before importing the Python module:

use std::env;
use pyo3::prelude::*;

fn main() -> PyResult<()> {
    // Set the PYTHONHOME and PYTHONPATH environment variables
    env::set_var("PYTHONHOME", "/path/to/pyenv/versions/my_py_env");
    env::set_var("PYTHONPATH", "/path/to/extern/python");

    // Import the Python module
    let gil = Python::acquire_gil();
    let py = gil.python();
    let py_module = PyModule::from_code(py, include_bytes!("../extern/python/main.py"), "main.py", "main")?;

    // Use the imported module...

    Ok(())
}

In this example, the PYTHONHOME variable is set to the path of the my_py_env virtual environment, and the PYTHONPATH variable is set to the path of the extern/python directory where the Python module is located.

Once you have set these environment variables, pyo3 will use the my_py_env virtual environment when importing the Python module in your Rust code.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading