Rust非常陌生。
我正在尝试使用rust-cypthon在Rust中构建一个python模块。目前,我可以访问cpython类型,但是不能调用py_module_initializer!我相信这是使模块在python中运行所必需的。
在编译代码,将扩展名更改为.so并将文件放入我的python脚本并导入时,出现此错误:
ImportError: dynamic module does not define init function (initpyext_rust_onboard)
Cargo.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;
答案 0 :(得分:2)
在编译代码时,将扩展名更改为
.so
并将文件放入我的python脚本中
您从中重命名了什么? rust-cpython文档说
在Mac OS上,您需要将输出从
*.dylib
重命名为*.so
。在Windows上,您需要将输出从*.dll
重命名为*.pyd
。
在Linux上,您不应重命名任何内容。
问题可能是您实际上没有在构建共享库。你有
[lib] crate-type = ["dylib"]
但是rust-cpython自述文件说
[lib]
crate-type = ["cdylib"]
注意c
! cdylib
和dylib
完全不同。
答案 1 :(得分:1)
根据cpython
homepage,您需要启用extension-module
模块功能,因此请尝试:
[dependencies.cpython]
version = '0.3.0'
default-features = false
features = ["python27-sys", "extension-module-2-7"]