Python库分发的SO文件里面是什么?

Dim*_*ims 7 linux binaryfiles dynamic-linking python-3.x

有一个库,它由 3 个文件组成,这些文件打算放在站点 python 目录中。

FbxCommon.py
fbxsip.so
fbx.so
Run Code Online (Sandbox Code Playgroud)

一旦这些文件就位,Python 就可以看到fbxpackage.json。这个系统如何运作?SO里面的文件是什么?

如果它是一个 DLL,它怎么可能与 python 版本相关(它适用于 python 3.3,但不适用于 python 3.5)

更新

区分代码如下

from fbx import *
lSdkManager = FbxManager.Create()
Run Code Online (Sandbox Code Playgroud)

在 Python 3.3 上它什么也不做,而在 Python 3.5 上它会抛出此错误:

Traceback (most recent call last):
  File "/opt/pycharm-2017.2.2/helpers/pydev/pydevd.py", line 1599, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/opt/pycharm-2017.2.2/helpers/pydev/pydevd.py", line 1026, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/opt/pycharm-2017.2.2/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/home/dims/PycharmProjects/FBXCheck/fbxcheck.py", line 2, in <module>
    lSdkManager = FbxManager.Create()
AttributeError: type object 'FbxManager' has no attribute 'Create'
Run Code Online (Sandbox Code Playgroud)

Jer*_*imo 6

Windows 上的 .PYD 文件是具有 Python 接口的 .DLL。

在 Linux 上,这两者都使用 .SO 作为扩展名。因此,您的文件可能是具有 Python 接口(init 函数等)的 Linux 二进制文件,这就是为什么它们可以通过 Python 简单地导入,而无需使用 ctypes 或类似的东西。

编译时,这些扩展模块需要链接到 Python 的相应 .so(Windows 上的 .dll),因此在本例中可能使用了 python33.so。运行 Python 3.5 时,无法解析对 python33.so 的引用,因为仅加载 python35.so。所以失败了。您将需要使用专门链接到您的 Python 版本的版本。

更新

我只是尝试在 Windows 上使用 Python 3.6 导入相同的模块,这给了我

ImportError: DLL 加载失败: 找不到指定的模块。

这正是我所期望的运行错误的 Python 版本的结果。

也许在你的安装中,python33.so 存在于其他地方,然后被找到并加载,但由于你实际上是从 Python 3.5 运行的,所以它拒绝初始化,包括模块的初始化,这后来会导致错误。

我猜你在没有正确版本的 Python 解释器的情况下运行这些库会很不走运。如果您希望能够轻松地交换版本,也许可以看看virtualenv 。