各种API都需要调用初始化和终结方法。最近,我在使用Python时遇到了这种情况,其中所有的C++调用都必须在调用Py_Initialize和Py_FinalizeEx之间。我目前的解决方案是将这种调用放在主要方法的开头和结尾。这看起来并不理想,因为它将API的实际使用与它的资源管理分开。也就是说,使API调用的软件组件依赖于获取和破坏资源的主要方法。
在这种情况下,是否有通常应用的模式?
以下是我目前正在做的事情。
int redirected(int argc, char *argv[]) {
// Actual main method
return 0;
}
int main(int argc, char *argv[]) {
auto program = Py_DecodeLocale(argv[0], NULL);
if (program)
Py_SetProgramName(program);
else
throw new std::runtime_error("Py_SetProgramName");
Py_Initialize();
int errc = redirected(argc, argv);
if (Py_FinalizeEx() < 0)
throw new std::runtime_error("Py_FinalizeEx");
PyMem_RawFree(program);
return errc;
}发布于 2018-10-26 13:45:09
C++中正确的模式是使用RAII。事实上,这是一个很好的问题。
这意味着对象的构造函数将获取资源,析构函数将释放它。通过这种方式,您可以确保资源在超出作用域时始终被释放。
对于Python来说,它应该是:
class PyInit
{
public:
PyInit() {Py_Initialize();}
~PyInit() {Py_Finalize();}
}然后主要是:
int main()
{
PyInit pyinit;
// using Python interpreter
return 0;
}https://stackoverflow.com/questions/53009991
复制相似问题