python - 从 c++ 代码运行 python 脚本并在 c++ 中使用 pythons 输出
问题描述
我有一个 C++ 程序,它已经非常发达,可以完成自己的工作,现在我们想向它添加一个附加功能,我们认为在 Python 中制作所述功能,然后使用来自 C++ 的所需输入调用该 python需要时将是最好的方法,因为它可以将它们分开,并允许我们也可以从其他地方使用这个 python 脚本。
作为第一步,我决定尝试制作一个测试程序,看看它是如何工作的,这似乎是一个好主意,因为我无法让它工作。
如何从 c++ 运行单独的 python?
我已经尝试遵循本指南,虽然它看起来不错,但没有提供任何关于我应该使用哪些编译器选项运行它的信息?
我有两个文件,cpp.cpp 和 python.py
这是我的 cpp.cpp 文件:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <ncurses.h>
#include <Python.h>
using namespace std;
int main() {
std::cout << "C++ program started!\n";
char filename[] = "python.py";
FILE* fp;
Py_Initialize();
fp = _Py_fopen(filename, "r");
PyRun_SimpleFile(fp, filename);
Py_Finalize();
std::cout << "C++ program is ending!\n";
return 0;
}
我的 python 文件只有两个 printf 行:
#print('External Python program running...')
#print('Hello World from Python program')
然后我尝试编译它,给它所有它似乎想要的包含,然后执行输出文件:
g++ -I . -I /home/ahomm/python3.6/Include -I /home/ahomm/python3.6/release cpp.cpp && ./a.out
这是我得到的输出:
/tmp/cccQsh1p.o: In function `main':
cpp.cpp:(.text+0x3f): undefined reference to `Py_Initialize'
cpp.cpp:(.text+0x52): undefined reference to `_Py_fopen'
cpp.cpp:(.text+0x70): undefined reference to `PyRun_SimpleFileExFlags'
cpp.cpp:(.text+0x75): undefined reference to `Py_Finalize'
collect2: error: ld returned 1 exit status
我错过了什么?只是有点或完全错误?cpp 和 py 文件位于同一目录中。
然后如何在 C++ 中读取 python 的输出?还没到那个地步……
解决方案
您必须将代码与 libpython3.xa/python3.x.lib (x - 您使用的 python 版本)链接。链接哪个文件:*.a 或 *.lib 取决于您的操作系统。这些文件可用于 python 分发。
这是一个适用于我的 cmake 代码:
cmake_minimum_required(VERSION 2.8.9)
project (embpy)
add_executable(embpy embpy.cpp)
target_include_directories(embpy PRIVATE /path-to-python/Python38/include/python3.8)
target_link_libraries(embpy /path-to-python/Python38/lib/libpython3.8.a)
embpy.cpp 和你的一样
推荐阅读
- android - 如何解决加载文件时的编码错误?
- nginx - nginx入口子路径重定向
- sql-server - Bcp 实用程序 - 如何导入 10 亿条记录。数据文件到 SQL 服务器
- python - Pandas 在读取格式错误的数据时不会引发异常
- python-3.x - Python等待消息的时间限制
- ios - 如何从特定的 UICollectionViewCell 中删除 firebase 子节点 - Swift
- spring-boot - 更改我的 Spring Boot 模板的默认位置会引发 404
- cgal - 三角面网格的参数化
- amazon-web-services - 如何将 Amazon 证书与在 EC2 服务器上运行的 neo4j 实例链接?
- c# - 如何在 Selenium C# (ChromeDriver) 中使用带有登录名和密码的代理