#python #macos #rust #anaconda
Вопрос:
Я пытаюсь вызвать код python из rust (для модульного тестирования некоторого кода rust). Поэтому я нашел библиотеку CPython, которая позволяет это.
// src/main.rs
use cpython::{Python, PyDict, PyResult};
fn main() {
let gil = Python::acquire_gil();
}
//Cargo.toml
[package]
name = "python-rust"
version = "0.1.0"
authors = ["bashir ABDEL WAHED <bashir.abdelwahed@biogen.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
cpython = { version = "0.5.2", features = ["extension-module"] }
//.cargo/config.toml
[target.x86_64-apple-darwin]
rustflags = [
"-C", "link-arg=-undefined",
"-C", "link-arg=dynamic_lookup",
]
Когда я это делаю cargo run
, я получаю следующую ошибку:
dyld: lazy symbol binding failed: Symbol not found: _Py_IsInitialized
Referenced from: /Users/babdelwa/tmp/programs_for_documentation/python-rust/target/debug/python-rust
Expected in: flat namespace
dyld: Symbol not found: _Py_IsInitialized
Referenced from: /Users/babdelwa/tmp/programs_for_documentation/python-rust/target/debug/python-rust
Expected in: flat namespace
Окружающая среда:
- Я использую macOS Mojave.
- Я использую python анаконды 3.8.3
- для ржавчины: я нахожусь на macOS Mojave. Я использую python 3.8.3 от anaconda И для rust:
active toolchain
----------------
stable-x86_64-apple-darwin (default)
rustc 1.50.0 (cb75ad5db 2021-02-10)
Не могли бы вы, пожалуйста, помочь мне понять проблему и как ее решить?
Ответ №1:
Эта extension-module
функция предназначена для создания модулей расширения, в которые python
загружается исполняемый файл .so
. Эта функция позволяет избежать привязки к libpython, вместо этого просто используя существующие символы из интерпретатора Python, уже запущенного в текущем процессе при загрузке кода Rust. Это улучшает совместимость с различными интерпретаторами Python (особенно важно для статически связанных питонов).
Если все наоборот (ваш исполняемый файл загружает интерпретатор python), вы не должны активировать эту extension-module
функцию. Затем код Rust будет связан с libPython, который предоставляет необходимые символы.
Комментарии:
1. Я удалил
extension-module
функции, и поэтому я получил эту ошибку: ошибка: связь сcc
ошибкой: код выхода: 1 = примечание: «cc» «-m64» «-arch» «x86_64» «-L» … = примечание: ld: в /Users/babdelwa…deps/libpython3_sys-c8335776a557cab4.rlib(boolobject.o) не удалось проанализировать объектный файл /Users/babdelwa/…/deps/libpython3_sys-c8335776a557cab4.rlib(boolobject.o): ‘Неизвестный тип атрибута (62) (Производитель: ‘LLVM10.0.0’ Читатель: ‘LLVM APPLE_1_1100.0.33.17_0′)’, использование libLTO версии ‘LLVM версии 11.0.0, (clang-1100.0.33.17)’ для архитектуры x86_64 clang: ошибка: не удалось выполнить команду компоновщика …