在程序继续C++时保持进程运行

Keep process running while program continues C++

本文关键字:进程 运行 程序 继续 C++      更新时间:2023-10-16

我希望能够通过C++调用python脚本中的函数。该函数将打印一些文本到标准输出。

但是,python 脚本大约需要 1 分钟才能将全局变量加载到内存中,因此我希望在交互模式下保持进程处于活动状态,在这种情况下,我可以简单地再次调用该函数,而无需再次加载所有变量。

我知道我可以使用 system 运行系统命令,但命令必须先终止,然后才能使用输出。我也知道我可以使用 CPython 并在文件上调用PyRun_SimpleFileEx,但这必须再次重新加载所有变量

我没有任何代码要显示,因为我不知道该怎么做。有什么方法可以在不C++重写整个 python 脚本的情况下做到这一点?

每个PyRun_*函数都在__main__模块中运行,因此您定义的任何函数或变量都会保留以备将来执行。

例如,假设我们要多次从此文件 (helper.py( 运行do_it函数:

from datetime import datetime as dt
from time import sleep
print("First load")
def do_it():
print("Helper function called on demand: %s" % dt.now())
sleep(1)
do_it()

我们可以简单地调用一次PyRun_SimpleFile,然后使用PyRun_SimpleString("do_it()n");再次访问该函数。

#define PY_SSIZE_T_CLEAN
#include <Python.h>
int main(int argc, char *argv[])
{
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]n");
exit(1);
}
Py_SetProgramName(program);  /* optional but recommended */
Py_Initialize();
FILE *fp = fopen("helper.py", "rb");
PyRun_SimpleFile(fp, "helper.py");
for (int i = 0; i < 10; i++) {
PyRun_SimpleString("do_it()n");
}
if (Py_FinalizeEx() < 0) {
exit(120);
}
PyMem_RawFree(program);
return 0;
}

请注意,这使用了"非常高级的嵌入",因此仅限于计算字符串。对于更复杂的参数,您可能希望使用"纯嵌入"来从模块中获取PyFunctionObject并调用它。

最后,你可能想看看pybind11,这是Python和C++之间的C++11桥。这应该使得获取 Python 函数并直接从C++调用它变得非常容易。