2017-09-23 136 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模塊運行相應的命令,然後解析輸出以獲得您所需要的信息。