2013-04-05 128 views
4

我有一堆python代碼,我想用一個C接口「編譯」到一個共享庫中,該接口可以與其他C/C++程序連接,並且不依賴於太多其他libs(可能是python和其他一些dll,但它們都應該被包含到一個包含最終庫的目錄中)。編譯python到共享庫

我真的不想爲此重寫python代碼到C++中。我當然可以,但最好有一個獨立的lib,可以像dll/so lib一樣使用。我已經嘗試過使用cython,並希望編譯python到C然後只是編譯C代碼到一個dll,但似乎還沒有工作(我還沒有能夠使它的工作完美無缺)。然後我也試過bbfreeze - 但是bbfreeze支持創建一個.so文件嗎?無法找到如何去做。有人知道嗎?

您是否知道更直接的其他選項? python代碼只需要編譯一次。最重要的是,如果它創建一個.so文件,無論它有多大,只是沒有太多的依賴關係。

+3

http://stackoverflow.com/questions/138521/is-it-feasible-to-compile-python-to-machine-code – 2013-04-05 22:10:44

+0

http://stackoverflow.com/questions/4421832/compiling-python-to -c-using-cython – 2013-04-05 22:11:02

+0

@JonathanVanasco:爲那些偉大的鏈接+1。它們非常古老('PyPy'自2008年以來已經走過了很長的一段路!),他們專注於編譯性能而不是方便分發,所以我認爲這是合理的,作爲一個單獨的問題,但它們是仍然有用的信息。 – abarnert 2013-04-05 22:14:40

回答

-2

Python更多地設置爲以其他方式工作:您的代碼是從Python調用的,整體邏輯是Python,而特定於問題的(和性能關鍵代碼)是用C/C++編寫的。

+2

這不是我問的。必須從已經編寫好的Python代碼中創建一個C++共享庫。我需要C++鏈接選項,因爲我需要使用從C++訪問的python實現的功能。 – mkschreder 2013-04-05 23:26:09

+0

@ user1953157,由於python的動態類型和C++的靜態類型,這是不可能的。你所要求的將是Python到C++ JIT引擎的等價物,這是不存在的。 – 2013-04-06 01:26:39

+0

@NathanErnst,它是可能的,完全沒有意義。它會結合最差的Python特性(相當低效)和C++(長編輯 - 編譯鏈接運行循環)。 – vonbrand 2013-04-06 01:35:49

0

您可以在C++應用程序中使用Python作爲庫:它被稱爲Python/C API

這個想法是,你初始化你自己的解釋器,然後你加載一個腳本。您可以通過Python解釋器中的全局變量或模塊暴露您的C++對象,以便您的代碼進行交互,您可以直接從C++代碼運行Python函數。

現在,我明白您可能希望將您的Python腳本嵌入到共享庫中:使用傳統的GNU工具鏈這不一定是一件容易的事情。有multiple techniques來實現這一點,但沒有一個是官方的,並且都顯得太複雜了,而不是僅僅在外部文件中有腳本。

如果您的目標是隱藏最終用戶的腳本,您可以使用私鑰對它們進行簽名或加密,並將公鑰嵌入到您的庫中,但請記住,密鑰可以輕鬆地通過任何人都有足夠的動力。