在程序继续C++时保持进程运行
Keep process running while program continues C++
我希望能够通过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++调用它变得非常容易。
相关文章:
- IPC使用多个管道和分支进程来运行Python程序
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 运行代码时,c++ 会终止进程
- 从 C++ 运行的进程偶尔会错过某个选项
- 父进程意外被子 cmd 杀死.exe运行 java jar 的进程 - WINDOWS 7 问题 - C++
- 如何在不丢失输出的情况下杀死/停止终端中正在运行的进程?
- Windows 将标准的 C 文件结构注入到正在运行的进程中
- 如何使用 c++ libboost 运行进程并获取其输出?
- 从Visual Studio 2017运行MPI应用程序,每个进程在不同的cmd窗口中
- GDB:运行不带符号的 cpp 进程调试
- 在程序继续C++时保持进程运行
- CLion 如何终止进程运行?
- 两个并发的 Python 进程可以在 Boost Python 中运行吗?
- 获取正在运行的进程的模块数
- C++ 减慢另一个正在运行的进程
- Linux 守护进程 - 运行函数两次
- SYSTEM_INFO::d wActiveProcessorMask是否可以在我的进程运行时更改
- 如何保持进程运行
- 程序(nload)在shell中执行时作为守护进程运行,但不在启动/自动化脚本中执行
- 从Mono上运行的C#进程运行C++应用程序.运行检测器错误