【发布时间】:2015-03-05 11:06:53
【问题描述】:
我目前正在尝试将 Python 嵌入到我的 C++ 应用程序中,以便为用户提供高级脚本编写可能性。
到目前为止,我的程序在 Windows 上运行良好(它完全可以运行),现在我正在尝试在 GNU/Linux(目前是 Debian 7)上做同样的事情,但这给我带来的麻烦比我预期的要多得多。
首先,我下载 python.tar.gz 并使用 enable-shared 选项从源代码编译它以获得 fPIC 选项:
./configure --enable-shared --prefix=/opt/python
制作 && 制作 altinstall
然后,感谢 pip:python3.4 -m pip install numpy,我安装了 numpy。简单的。
最后,我将安装复制到另一个位置(是的,它应该部署在任何地方),准确地说是在我的主目录中,并将其命名为 python_install。这个副本似乎让我很痛苦。
在代码方面,我调用了运行良好的 Py_Initialize。这是我到目前为止所做的:
#include "Python.h"
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include "numpy/arrayobject.h"
#include <iostream>
int InitNumpy()
{
import_array();
}
int main()
{
std::string python_home = "/home/xxxx/dev/test-python/python_install";
setenv("PYTHONHOME", python_home.c_str(),1 );
Py_Initialize();
std::cout << "Importing Numpy... ";
int cr = InitNumpy();
std::cout << cr << std::endl;
return 0;
}
ImportError: numpy.core.multiarray 导入失败
我认为错误很明显,Python 找不到任何库,包括 numpy。但是我已经尝试了从设置 PYTHONPATH 到使用 -Wl,-rpath 来设置其他目录的所有方法......甚至 PySys_SetPath......在 Windows 上工作的东西在 Linux 上失败了。
欢迎任何想法!谢谢。
编辑:这是我使用的makefile(已更正):
CC=g++
CFLAGS= -Ipython_install/include/python3.4m -Ipython_install/lib/python3.4/site-packages/numpy/core/include -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall
#Wrong
#LDFLAGS= -Lpython_install/lib/python3.4/config-3.4m -lpython3.4m -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-rpath,\$${ORIGIN}/python_install/lib
#Right
LDFLAGS= -Lpython_install/lib/ -lpython3.4m -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-rpath,\$${ORIGIN}/python_install/lib
EXEC=test-python
all: $(EXEC)
test-python: test-python.o
$(CC) -o $@ $^ $(LDFLAGS)
%.o: %.cpp
$(CC) -o $@ -c $< $(CFLAGS)
.PHONY: clean mrproper
clean:
rm -rf *.o
mrproper: clean
rm -rf $(EXEC)
选项直接来自 python3.4m-config 可执行文件...
【问题讨论】:
-
我无法重现您的问题。按照您提供的所有步骤进行操作,并且有效。我能想到的只是 numpy 在你给出的 python 主页下实际上并不存在。您是否尝试过运行安装的交互式解释器并导入 numpy(确保
PYTHONPATH未设置)? -
是的,我也是。长话短说:我第一次安装了 Python 并在我的小项目中复制安装。我不知道为什么,但 numpy 指的是第一次安装。 'strace' 给了我线索。我删除了第一次安装,现在它可以工作了...但是我希望将来能够与其他 Python 安装很好地集成,否则一些用户肯定会抱怨...
-
我发现 pip 被硬编码为使用原始安装路径来查找 python 可执行文件。也就是说,它不会尝试使用与其共享目录的 python 可执行文件。可能 pip 的安装路径也是硬编码的——这意味着您将无法移动 python 安装。
-
@Dunes :是的,你可能是对的。当我尝试在移动的文件夹上使用 pip 时,我得到一个
/usr/bin/ld: cannot find -lpython3.4m。真正的问题是:我应该通过 apt-get 在 .deb 存档中部署我的应用程序和 python 包装器......所以我可能会强制在某个地方安装 python。我必须考虑一下。 -
@Dunes 我终于找到了我的问题所在。生成文件不正确。我在 libpython.a 上静态链接,但是像 numpy 这样的附加安装使用了 libpython3.4.so,它似乎引发了一些我不明白的奇怪冲突。好吧,现在我在两边都使用了动态链接(共享对象),它工作得很好。 5 天的麻烦,一个奇怪的选择......
标签: python c++ linux python-3.4 python-c-api