2015-06-11 49 views
6

我知道C或C++中靜態和動態鏈接的區別。但在Python中意味着什麼?既然它只是一個解釋器,並且只有一種模塊的導入機制,那麼這是如何有意義的呢?在Python中靜態鏈接和動態鏈接意味着什麼?

如果我用cx_freeze通過排除特定庫來凍結我的Python應用程序,它是一種動態鏈接嗎?因爲用戶必須自行下載並安裝該庫才能運行我的應用程序。

其實我的問題是,我正在使用PySide庫(與LGPL v2.1)來開發Python GUI應用程序。圖書館說我應該動態鏈接到圖書館,以遵守他們的法律條款(與Qt相同)。在這種情況下,我如何動態鏈接到PySide?

+0

我想任何你通常會使用PySide算作動態鏈接的方式,即使它是同一下載的一部分。如果你構建了一個單獨的文件exe(cx_Freeze根本就不行),有些人可能會調用這個靜態鏈接,但我認爲大多數人仍然不會。繼續使用它 - 人們可以在那裏構建Python應用程序,所以如果這就是你正在做的事情,那麼你可能沒問題。 –

+0

謝謝托馬斯。 你的意思是,即使我構建單個文件的exe(使用pyinstaller或其他),它仍然是動態鏈接?如果可以,我可以繼續使用一個簡單的自述文件來下載pyside源文件。是嗎? – Kaje

+0

我想大多數人會說這仍然是動態鏈接,你提出的建議應該沒問題。如果你擔心,可以問[PySide郵件列表](http://lists.qt-project.org/mailman/listinfo/pyside) - 這是他們的解釋,這很重要。但是如果他們認爲這樣做不夠好,我會很驚訝。 –

回答

0

在python中沒有靜態鏈接。所有導入都需要在我們的目標機器上安裝正確的依賴關係。我們決定選擇這些庫的版本。

現在讓我們來看看Python的二進制構建器。在這種情況下,我們必須根據GNU定義來確定鏈接類型。如果用戶可以按照自己喜歡的方式替換依賴項,它就是動態的。如果依賴關係與二進制本身一起連接,那麼它就是靜態鏈接。在cx_freeze或pyinstaller的情況下,如果我們將其構建爲一個文件,它就是靜態鏈接。如果我們在正常模式下構建這個模式,那麼所有的依賴都作爲單獨的文件被收集起來,這是動態鏈接。想法是,我們是否可以取代目標機器的依賴關係。