Использование python из Rust проблема: dyld: ошибка привязки ленивого символа: Символ не найден: _Py_IsInitialized

#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: ошибка: не удалось выполнить команду компоновщика …