繁体   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