找不到py_module_initializer!在锈中构建python模块时

时间:2019-08-21 12:52:11

标签: python-2.7 rust cpython toml

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;

2 个答案:

答案 0 :(得分:2)

  

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

您从中重命名了什么? rust-cpython文档说

  

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

在Linux上,您不应重命名任何内容。

问题可能是您实际上没有在构建共享库。你有

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

但是rust-cpython自述文件说

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

注意ccdylibdylib完全不同。

答案 1 :(得分:1)

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

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