python - 使用 Numpy 将 Python 库静态链接到 C (C++)

标签 python c++ numpy linker static-linking

我正在开发一个 C++ 库,其中嵌入了 Python。我想做的是静态链接 Python 库,这样当我切换到生产服务器时就不会出现配置问题。到目前为止,我能够静态链接 libpython3.5m.a(不过我必须从源代码构建 Python,因为看起来打包的库不是用 -fPIC< 编译的标志)。但是,我遇到了一个问题,似乎没有 Numpy:当我运行使用我的库的应用程序时,它提示我一个错误:

ImportError: numpy.core.multiarray failed to import

此错误是由 import_array1() 宏引起的,该宏(据我所知)用于将 numpy 例程导入 C++。我尝试链接 libnpymath.a 以及 libnpysort.a,这是我在 numpy 构建目录中找到的,但无济于事。您碰巧知道这种静态链接是否可行以及如何实现?我想这应该是可能的,因为 numpy 是用 C 语言编写的...

最佳答案

What I would like to do is to statically link Python library, so that there won't be configuration issues, when I switch to production server.

这只会是 Python 核心,它会排除所有 Python 库。您仍然需要发布所有 Python 代码。

...since numpy is written in C...

这是不正确的。 NumPy 大约一半是用 C 语言编写的,一半是用 Python 编写的。看起来 C 部分是未在此处加载的部分,因为 numpy.core.multiarray 是用 C 编写的,您通常不会自己导入它,它通常由 Python 导入NumPy 的一部分。

在C代码中链接是不够的,你需要加载初始化C代码导出的关联Python模块。如果没有静态链接,Python 只会在正确的位置找到 multiarray.so 文件并加载它。当您静态构建 Python 时,您通常会使用要静态编译到 Python 中的模块来编辑 Modules/Setup.local 文件。但是,这并非设计用于与 NumPy 等任意第三方模块一起使用。请参阅:Compile the Python interpreter statically?


老实说,如果您只是想确保同一版本的 Python 在开发和生产系统上运行,有非常更简单的方法可以做到这一点,比如 virtualenv。 CPython 根本就不是为静态链接而设计的。

关于python - 使用 Numpy 将 Python 库静态链接到 C (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46984168/

相关文章:

python - js和template标签对比

C++ - 将具有不同维度的不同矩阵集相乘的函数

python - 如何在 tkinter 中获取鼠标相对于父小部件的位置?

python - Django-cms错误 "unsupported operand type(s) for +: '设置'和 'tuple'“

python - 集合计数器,如果 key 不存在,添加列表将不起作用

c++ - 函数指针默认为 NULL 吗?

c++ - 在 Xcode 4 中添加自定义目的地

python - 在 Numpy 中逐像素迭代两个图像(具有随机条件)

python - 使用python查找图像中黑色/灰色像素的所有坐标

python - 关于hough_line和hough_line_peaks的代码解释