首页 > 解决方案 > pyo3 - 获取异步函数的结果

问题描述

我正在尝试将 rust 异步函数导出到 python。

这就是我想在我的 python 文件中使用的方式。

from rust_lib import get_weather

async def call_me():
    weather = await get_weather()
    print(weather.current_tmp)

在 Rust 中,我确实喜欢

#[pyclass]
#[derive(Debug, Default)]
struct Weather {
    #[pyo3(get)]
    current_tmp: String,
}

async fn get_weather() -> Result<Weather, reqwest::Error> {
    let client = reqwest::Client::builder()
        .danger_accept_invalid_certs(true)
        .connect_timeout(Duration::from_secs(2))
        .build()?;

    let res = client.get(url).header(USER_AGENT, "User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36").send().await?;
    let body = res.text().await?;

    // HTML Parse
    let mut weather: Weather = Default::default();

    let document = Html::parse_document(&body);

   // some parsing

    Ok(weather)
}

但是在这里我得到了这个错误future cannot be sent between threads safely

#[pyfunction]
fn get_weather(py: Python) -> PyResult<&PyAny> {
    pyo3_asyncio::tokio::future_into_py(py, async move {
        let weather = weather_parse().await.unwrap().into_py(py);
        Ok(weather)
    })
}

在这里卡了很长时间,甚至不知道我在做什么..

提前致谢!

标签: rustpyo3

解决方案


推荐阅读