C++通过内嵌解释器调用Python及间接调用Python三方库

目录
  • 1.移植Python解释器
  • 2.VS配置(VS2017为例,此教程与VS版本无关)
  • 3.C++调用程序样例
  • 4.被调Python程序样例

本文章目的是脱离安装Python环境的前提下,由C++程序调用Python程序及Python相关三方库

1.移植Python解释器

Python环境的目录结构

路径详解

需要用的如下图
1.红色部分是生成路径下解释器运行时依赖
将红色部分拷贝到C++编译主ExE路径下即可
2.蓝色部分是VS配置编译时依赖

路径或文件名 作用
DLLs Python内部运行时核心及一些驱动
Lib 这里存放Python基础类库,开发人员所下载的Python三方库也会放在此目录下
python36.dll Python运行时主依赖
路径或文件名 作用
include C++调用所依赖的头文件,include时引用Python.h即可
libs C++调用所依赖的静态描述文件,C++Dll隐式调用引用python36.lib即可

2.VS配置(VS2017为例,此教程与VS版本无关)

这里我就写绝对路径为例

记得将Dlls,Lib,python36.dll拷贝到生成目录下,如果新增python三方库,重新拷贝Lib文件夹或者进行whl安装,这里就不做whl的介绍了

//在stdafx.cpp中
#pragma comment(lib,"python36.lib")

3.C++调用程序样例

Py_Initialize();//加载Python解释器
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('Dlls/')");

PyObject * pModule = NULL;
PyObject * pFunc = NULL;
PyObject *pArgs = NULL;
PyObject *pResult = NULL;
pModule = PyImport_ImportModule("ExternalPythonTool");//Python py文件名
if (pModule == nullptr)
	return true;
pFunc = PyObject_GetAttrString(pModule, "add_func");//py文件内函数名
//传入参数
pArgs = Py_BuildValue("ii", 1, 2);
//执行函数
pResult = PyObject_CallObject(pFunc, pArgs);
//返回值为C++
double a = PyLong_AsDouble(pResult);

Py_Finalize();//卸载Python解释器

Py_Initialize方法初始化消耗资源较大,不建议反复进行初始化及卸载。

4.被调Python程序样例

简单加法运算,并且调用了numpy装载array,作为c++间接调用Python三方库的测试

//ExternalPythonTool.py
import math
import numpy as np
def add_func(x,y):
    a = math.sqrt(9)
    data = [[1,2],[3,4],[5,6]]
    b = np.array(data)
    return x + y

将ExternalPythonTool.py也拷贝到C++exe运行路径

教程到此结束,网上诸多教程没有说明Dlls文件夹的作用,导致Python引用了如numpy 等三方库后PyImport_ImportModule环节就会出错,经学习解释器机理发现了Dlls内pyd文件的作用,特此出一详解教程希望和大家共同学习。

(0)

相关推荐

  • 深入解析C++设计模式编程中解释器模式的运用

    解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子.这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题.当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式.用了解释器模式,就意味着可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,

  • C++设计模式之解释器模式

    前言 那日,闲的无聊,上了一个在线编程学习网站:最近那个在线编程学习网站很火啊:之前,盖茨.扎克伯格等大人物都来宣传了,思想是人人都应该学习编程:我一想就这算怎么回事啊?这要是在中国,还让人活不?话题不扯开了,还是说我上了那个在线编程网站吧,首先是给你玩一个小游戏,激发你对编程的兴趣.游戏是这样的,网页上有一个编辑框,屏幕上有一只小狗,比如你在编辑框中输入这样的句子:down run 10:按下回车,这个时候,你就看到屏幕上的小狗向下跑动了10个方格大小的长度:你再输入up walk 5,按下回

  • C++通过内嵌解释器调用Python及间接调用Python三方库

    目录 1.移植Python解释器 2.VS配置(VS2017为例,此教程与VS版本无关) 3.C++调用程序样例 4.被调Python程序样例 本文章目的是脱离安装Python环境的前提下,由C++程序调用Python程序及Python相关三方库 1.移植Python解释器 Python环境的目录结构 路径详解 需要用的如下图 1.红色部分是生成路径下解释器运行时依赖 将红色部分拷贝到C++编译主ExE路径下即可 2.蓝色部分是VS配置编译时依赖 路径或文件名 作用 DLLs Python内部运

  • python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例

    这几天研究了下PyQt5中QWebEngineView内嵌网页与Python的数据交互,今天把实例方法与代码发布出来供大家参数 数据交互需要load进一个网页,这里我选择load进一个本地html网页:JSTest.html. 同时,QWebEngineView与外面的交互还需要Qt官方提供的一个js文件:qwebchannel.js,这个文件可以在网上下载. JSTest.html和qwebchannel.js两个文件放在同一个目录下,我这边都是放在Python工程目录下. qwebchann

  • python录音并调用百度语音识别接口的示例

    #!/usr/bin/env python import requests import json import base64 import pyaudio import wave import os import psutil #首先配置必要的信息 def bat(voice_path): baidu_server = 'https://aip.baidubce.com/oauth/2.0/token?' grant_type = 'client_credentials' client_id

  • python运行或调用另一个py文件或参数方式

    目录 python运行或调用另一个py文件或参数 1. 运行另一个py文件 2. 引用另一个py文件中的变量 python调用自己写的py文件 python如何调用自己写的py文件呢? 如果是不同目录怎么调用呢? 如果需要调用的多个文件在多个目录呢? 关于__init__.py的解释 关于sys.path的解释 关于pyc与pyo文件 模块导入时内部的原理 python运行或调用另一个py文件或参数 1. 运行另一个py文件 (1)在file_A.py中运行file_B.py文件 import

  • php内嵌函数用法实例

    本文实例讲述了php内嵌函数用法.分享给大家供大家参考.具体分析如下: php中可以在函数内部内嵌一个函数,调用范围仅限于函数本身 <?php function msg() { echo("<center><h2>Displaying even numbers</h2></center><p><p>"); function displayeven() { $ctr=0; echo("<font

  • javascript 窗口加载蒙板 内嵌网页内容

    复制代码 代码如下: //初始化导航背景,iframe容器 function fnDaoHangBg() { var h = fnGetHeight(),w = fnGetWidth();//获取背景窗口大小 if(!$('divDaoHangBg')) { var div = $C('div');//创建背景蒙板 div.id = 'divDaoHangBg'; div.style.backgroundColor = 'black'; div.style.position = 'absolut

  • 关于js函数解释(包括内嵌,对象等)

    常用写法: function add(a,b) { return a + b; } alert(add(1,2)); // 结果 3 当我们这么定义函数的时候,函数内容会被编译(但不会立即执行,除非我们去调用它).而且,也许你不知道,当这个函数创建的时候有一个同名的对象也被创建.就我们的例子来说,我们现在有一个对象叫做"add"(要更深入了解,看底下函数:对象节.) 匿名函数: 我们也可以通过指派一个变量名给匿名函数的方式来定义它. var add = function(a,b) {

  • Spring Boot启动过程(五)之Springboot内嵌Tomcat对象的start教程详解

    标题和Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动很像,所以特别强调一下,这个是Tomcat对象的. 从TomcatEmbeddedServletContainer的this.tomcat.start()开始,主要是利用LifecycleBase对这一套容器(engine,host,context及wrapper)进行启动并发布诸如configure_start.before_init.after_start的lifecycleEvent事件给相应的监听器(如

  • Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动

    之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void createEmbeddedServletContainer() { EmbeddedServletContainer localContainer = this.embeddedServletContainer; ServletContext localServletContext = getServ

  • Python中用字符串调用函数或方法示例代码

    前言 本文主要给大家介绍了关于Python用字符串调用函数或方法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 先看一个例子: >>> def foo(): print "foo" >>> def bar(): print "bar" >>> func_list = ["foo","bar"] >>> for func in func_li

随机推荐