簡體   English   中英

使用 Numpy 將 Python 庫靜態鏈接到 C (C++)

[英]Static linking Python library to C (C++) with Numpy

我正在開發一個 C++ 庫,其中嵌入了 python。 我想做的是靜態鏈接 Python 庫,以便在切換到生產服務器時不會出現配置問題。 到目前為止,我能夠靜態鏈接libpython3.5m.a (盡管我必須從源代碼構建 Python,因為看起來打包的庫不是使用-fPIC標志編譯的)。 但是,我遇到了一個問題,似乎沒有 Numpy: 當我運行使用我的庫的應用程序時,它提示我一個錯誤:

ImportError: numpy.core.multiarray failed to import

此錯誤是由import_array1()宏引起的,即 (AFAIK) 用於將 numpy 例程導入 C++。 我嘗試鏈接libnpymath.alibnpysort.a ,我在 numpy 構建目錄中找到了它,但無濟於事。 您是否知道,這種靜態鏈接是否可行以及如何進行? 我想這應該是可能的,因為 numpy 是用 C 編寫的...

我想做的是靜態鏈接 Python 庫,以便在切換到生產服務器時不會出現配置問題。

這只是 Python 核心,它將排除所有 Python 庫。 您仍然需要提供所有 Python 代碼。

...因為 numpy 是用 C 編寫的 ...

這是不正確的。 NumPy 大約一半用 C 編寫,一半用 Python 編寫。 看起來 C 部分是這里沒有加載的部分,因為numpy.core.multiarray是用 C 編寫的,你通常不會自己導入它,它通常會被 NumPy 的 Python 部分導入。

在 C 代碼中鏈接是不夠的,您需要加載初始化 C 代碼導出的相關 Python 模塊。 如果沒有靜態鏈接,Python 只會在正確的位置找到multiarray.so文件並加載它。 靜態構建 Python 時,通常會使用要靜態編譯到 Python 中的模塊編輯Modules/Setup.local文件。 但是,這並不是為與 NumPy 等任意第三方模塊一起使用而設計的。 請參閱: 靜態編譯 Python 解釋器?


老實說,如果你只是想確保Python的相同版本的開發和生產系統上運行,也有容易很多方法可以做到這一點,喜歡的virtualenv。 CPython 根本沒有被設計為靜態鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM