如何使我的基于PyO3的库在Python版本间更易移植?

问题描述 投票:0回答:1

我有一个用PyO3创建的库,在我的系统上使用Python 3.5.2。.so文件链接到相应的libpython3.5m文件。

$ ldd my_library.so
    linux-vdso.so.1 =>  (0x00007ffffc823000)
    libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007fcac34b0000)
    ...

但是如果我尝试在另一个系统上使用不同的Python小版本(例如,3.6.9或3.7.3)来使用我的库,该库并不存在。

$ ldd my_library.so
    linux-vdso.so.1 (0x00007fffefaae000)
    libpython3.5m.so.1.0 => not found
    ...

因此,我不能使用我的库。

$ python3
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_library
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory

有没有一种方法可以让我把我的库与 libpython 更加通用地连接起来,以适应这些小版本的变化,或者至少允许向后兼容 (在新版本上构建,但允许旧版本的 Python 也使用我的库)?或者说我可以在运行时做什么来让库仍然发挥作用?

python rust shared-libraries pyo3
1个回答
1
投票

Python扩展模块根本不应该链接到libpython。Python 符号将不被解析,动态加载器将在加载模块的任何 python 解释器中查找它们。这样你甚至可以用静态链接的 Python 来使用你的模块。

rust-cpython 有一个 extension-module 你可以在你的Cargo.toml中启用它。

[dependencies]
pyo3 = { version = ..., features = [ "extension-module" ] }
© www.soinside.com 2019 - 2024. All rights reserved.