问题描述
我正在尝试编写一个可以从 Python 调用的 Rust 模块。我正在关注此页面:
https://developers.redhat.com/blog/2017/11/16/speed-python-using-rust#edit_src_lib_rs
在 cargo build --release
我收到此错误:
= 注意:链接:致命错误 LNK1181:无法打开输入文件 'python39.lib'
这之前出现过,this 似乎是最新且相关的答案。
我似乎已经尝试了该答案中所有可能的解决方案,包括定位和运行 vcvars64.bat,详见 here。没有快乐。
我安装了 MS Visual Studio (2019),以及 C++ 和 W10 SDK 组件。
重要的是,当我不包括 --release
开关。没有它,程序(有时)编译并运行正常。鉴于想要制作 Rust 模块的一个原因是性能,但是,我想解决这个问题。此外,我现在还发现,“调试”版本的这种成功构建是 a) 间歇性和 b) 部分性的:当它失败时,会创建一些所需的输出文件,但不会创建其他文件。
还有……
根据第一个链接的页面,在 build
之后,我应该寻找以 .so 结尾的文件。在 W10 操作系统中,我正在寻找 .dll 文件。
如果它完全成功构建,在 target\debug 下我有 myrustlib.d、myrustlib.dll、myrustlib.dll.exp、myrustlib.dll.lib、myrustlib.pdb、pyext_myrustlib.pdb、pyext_myrustlib.d 和 pyext_myrustlib.exe .这些,重命名和/或赋予 .dll 扩展名(如适用)都不能作为 Python 模块成功导入,至少如该页面上所述。
我也发现 this more recent page 可以做同样的事情。我收到同样的 1181 错误。
python39.lib
我找到了它在我系统中的位置,在 ... Python\python39\libs 下。我修改了我的 PATH env var 以专门包含此路径(并重新启动)。还是一样的错误。
解决方法
解决方法:
This page,使用 PyO3 而不是 rust-cpython(实际上是后者的一个分支),至少在我的机器 + 操作系统上似乎可以成功完成。
注意在编写第二个示例时似乎包含一个错字:我认为应该是
fn hashset(_: Python,m: &PyModule) -> PyResult<()> {
而不是
fn hash_set(_: Python,m: &PyModule) -> PyResult<()> {
如果你想让它编译好(作者已被通知)。我设法创建了一个模块(W10 操作系统中的 hashset.cp39-win_amd64.pyd),它成功地使您能够将此 Rust 构造导入 Python。