什么是Python库分发的SO文件内部?

时间:2017-10-06 14:49:07

标签: linux python-3.x binaryfiles dynamic-linking

got a library,由3个文件组成

FbxCommon.py
fbxsip.so
fbx.so

旨在放在站点python目录中。

一旦这些文件到位,Python就可以看到fbx包。这个系统是如何工作的?什么是SO文件?

如果是DLL,它如何依赖于python版本(它适用于python 3.3,但不适用于python 3.5)

更新

区分代码如下

from fbx import *
lSdkManager = FbxManager.Create()

在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'

1 个答案:

答案 0 :(得分:3)

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

在Linux上,这两个都使用.SO作为扩展名。所以你的文件可能是带有Python接口的Linux二进制文件(init函数等),这就是为什么它们可以简单地由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运行,它拒绝初始化,包括模块的初始化,稍后会导致错误。< / p>

如果没有正确版本的Python解释器,我猜你运行这些库是运气不好的。如果您希望能够轻松交换版本,可以查看virtualenv