【发布时间】:2019-08-19 01:09:30
【问题描述】:
我正在尝试在 C++ 下调用 Python 中的函数。
这是我的尝试:
void myFuncion()
{
PyObject* fExportar = nullptr;
PyObject* modulo = nullptr;
PyObject* pName = nullptr;
const char *scriptDirectoryName = "path/of/my/pyfile";
Py_Initialize();
PyObject *sysPath = PySys_GetObject("path");
PyObject *path = PyUnicode_FromString(scriptDirectoryName);
int result = PyList_Insert(sysPath, 0, path);
if (result == 0 )//0 if ok, -1 if error
{
pName = PyUnicode_FromString("exportarXLS");//exportarXLS.py
modulo = PyImport_Import(pName);
Py_DECREF(path);
if (modulo)
{
fExportar = PyObject_GetAttrString(modulo, "exportar");//it crahs here
Py_DECREF(modulo);
if (fExportar)
{
//call the function
}
}
}
else
{
PyErr_Print();
}
Py_Finalize();
}
}
问题是如果 python 脚本有任何错误import,我的 C++ 程序就会崩溃。在这种情况下,我怀疑我尝试使用无效版本的 PyQt4。
这是模块:(exportarXLS.py)
#!/usr/bin/python3
from PyQt4 import QtCore, QtGui, QtSql
def exportar():
print ("hello, I am probing")
现在我的问题:
现在我开始探索开发用于加载 python 插件的函数的步骤,我想知道如果有人想添加错误的脚本import,我将如何避免崩溃
我也尝试将有问题的行包含在 try/catch 块中,但它不起作用。
编辑:
我忘了说它只发生在我的 Qt 项目中 如果我尝试从中运行我的功能,我会在加载模块时遇到错误,但它不会崩溃。 我已经修改了标题
【问题讨论】:
-
无法为此重现崩溃。如果模块无法加载,我不会崩溃,我只会得到一个 NULL。管道胶带解决方法在这里并没有真正的帮助,因为它很可能是一个环境问题,它触发了您需要找到根源的问题。您可以尝试使用环境变量
PYTHONVERBOSE来查看通过 C++ 加载和直接从 python3 加载之间的区别,看看是否有区别。我会给你一个“如果发生 SEGV”的选项,但你需要确定它的原因。