gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:08:09 26 4
gpt4 key购买 nike

我正在开发一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com