如何使我的基于 PyO3 的库在 Python 版本之间更具可移植性?

How can I make my PyO3-based libraries more portable across Python versions?

我在我的系统上使用 Python 3.5.2 使用 PyO3 创建了一个库。 .so文件links到对应的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

有没有一种方法可以 link 我的库到 libpython 更普遍地适应这些次要版本更改或至少允许向后兼容(建立在较新版本上但允许旧版本 Python 也可以使用我的图书馆)?或者我可以在运行时做些什么来让库仍然运行?

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

的模块

rust-cpython 有一个 extension-module 特性,PyO3 似乎复制了那个。 您可以在 Cargo.toml:

中启用它
[dependencies]
pyo3 = { version = ..., features = [ "extension-module" ] }