pyinstaller打包python程序为exe文件,如何通过C++调用此exe文件并得到该文件的返回数据,其中C++调用exe文件的输入是自定义的?
时间: 2024-03-10 08:46:24 浏览: 118
pyinstaller将含有多个py文件的python程序做成exe
5星 · 资源好评率100%
要通过C++调用已经打包成exe文件的Python程序并获取其返回数据,可以使用C++的`system`函数或`CreateProcess`函数来执行该exe文件,并通过传递命令行参数来实现自定义输入。具体步骤如下:
1. 使用`system`函数或`CreateProcess`函数来执行该exe文件。
```c++
// 使用system函数
system("python_exe_file.exe arg1 arg2");
// 使用CreateProcess函数
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CreateProcess("python_exe_file.exe", "arg1 arg2", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
```
其中`arg1`和`arg2`是自定义的输入参数,可以根据需要进行修改。
2. 通过重定向标准输出来获取Python程序的返回数据。
```c++
// 使用system函数
char buffer[1024];
FILE* pipe = _popen("python_exe_file.exe arg1 arg2", "r");
if (!pipe) throw std::runtime_error("popen() failed!");
while (fgets(buffer, sizeof(buffer), pipe) != NULL) {
// 处理Python程序的输出数据
}
_pclose(pipe);
// 使用CreateProcess函数
char buffer[1024];
SECURITY_ATTRIBUTES sa;
ZeroMemory(&sa, sizeof(sa));
sa.bInheritHandle = TRUE;
HANDLE hRead, hWrite;
CreatePipe(&hRead, &hWrite, &sa, 0);
SetHandleInformation(hRead, HANDLE_FLAG_INHERIT, 0);
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL, "python_exe_file.exe arg1 arg2", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(hWrite);
while (ReadFile(hRead, buffer, sizeof(buffer), NULL, NULL) && strlen(buffer) > 0) {
// 处理Python程序的输出数据
}
CloseHandle(hRead);
```
其中`buffer`是存储Python程序返回数据的缓冲区,可以根据需要进行修改。
需要注意的是,C++调用Python程序时需要保证Python环境已经配置好,并且调用的Python程序与C++程序的位数和Python版本一致,否则可能会出现兼容性问题。
阅读全文