0

Rust 非常新。

我正在尝试使用 rust-cypthon 在 Rust 中构建一个 python 模块。目前,我可以访问 cpython 类型但不能调用 py_module_initializer!我认为这是使模块在 python 中运行所必需的。

编译代码,将扩展名更改为 .so 并将文件与我的 python 脚本一起放入并导入时,我收到此错误:

ImportError: dynamic module does not define init function (initpyext_rust_onboard)

货运.toml

[lib]
crate-type = ["cdylib"]

[dependencies]
csv = "1.1.1"
serde = "1.0.99"
serde_derive="1.0"
serde_json= "1.0"
serde_yaml = "0.7.1"

[dependencies.cpython]
version = '0.3.0'
default-features = false
features = ["python27-sys", "extension-module-2-7"]

导入到 lib.rs 的依赖项

#[macro_use]
extern crate serde;
extern crate serde_derive;

#[macro_use]extern crate cpython;


use std::fs::File;
use std::collections::HashMap;
use std::borrow::Cow;
use std::error::Error;
use cpython::{Python, PyObject, PyResult, PyString, PyFloat};
use csv::DeserializeRecordsIter;
4

2 回答 2

2

编译代码时,将扩展名更改为.so并将文件放入我的 python 脚本

你是从什么开始重命名的?rust-cpython文档说

在 Mac OS 上,您需要将输出从 重命名*.dylib*.so. 在 Windows 上,您需要将输出从 重命名*.dll*.pyd

在 Linux 上你不应该重命名任何东西。

问题可能是您实际上并没有构建共享对象。你有

[lib]
crate-type = ["dylib"]

但是rust-cpython自述文件说

[lib]
crate-type = ["cdylib"]

注意ccdylibdylib生锈的东西不同。

于 2019-08-21T13:48:49.497 回答
1

根据cpython主页,您需要启用extension-module模块功能,因此尝试:

[dependencies.cpython]
version = '0.3.0'
default-features = false
features = ["python27-sys", "extension-module-2-7"]
于 2019-08-21T13:53:47.367 回答