2017-09-23 75 views
0

与导入PyQt5模块后:如何找到Qt库的位置

from PyQt5 import QtWidgets 

我可以在其中找到该模块通过简单:

print QtWidgets 

打印:

<module 'PyQt5.QtWidgets' from '/usr/local/lib/python2.7/site-packages/PyQt5/QtWidgets.so'> 

但除了PyQt5模块,还有一个Qt库。这个Qt库是一组预编译的二进制文件,位于磁盘上的某处。它们的文件名通常在中间包含一个单词“Qt5”,例如:libQt5Core.dylib,libQt5DesignerComponents.dyliblibQt5Script.dylib

PyQt5模块导入后,有没有办法从Python内部获取文件路径到这个Qt库?如何找出Python在PyQt5模块所需的Qt库文件中的位置?

回答

1

libQt5Core.dylib这样的文件是在运行时动态链接的共享库。当创建一个需要这样的库的可执行文件时,编译时链接器只需记录该库的名称以及它提供的应用程序所需的任何例程。运行应用程序时执行动态链接是操作系统的工作。

Unix系统通常提供一种工具,可以确定可执行文件所需的依赖关系,并显示它们当前位于系统中的位置。在Linux上,此工具名为ldd(列出动态依赖项),OSX上的等效命令为otool -L。输出看起来是这样的:

$ ldd /usr/lib/python3.6/site-packages/PyQt5/QtCore.so 
    linux-vdso.so.1 (0x00007ffd351e7000) 
    libQt5Core.so.5 => /usr/lib/libQt5Core.so.5 (0x00007f1cdc1c5000) 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f1cdbe3e000) 
    libc.so.6 => /usr/lib/libc.so.6 (0x00007f1cdba87000) 
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f1cdb869000) 
    ... 

从Python中,你可以简单地使用subprocess模块运行相应的命令,然后解析输出以获得您所需要的信息。