C++调用Python脚本中的函数
1.环境配置
安装完python后,把python的include和lib拷贝到自己的工程目录下
然后在工程中包括进去
2.例子
先写一个python的测试脚本,如下
这个脚本里面定义了两个函数Hello()和_add()。我的脚本的文件名叫mytest.py
C++代码:
- #include "stdafx.h"
- #include <stdlib.h>
- #include <iostream>
- #include "include\Python.h"
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- //初始化Python环境
- Py_Initialize();
- PyRun_SimpleString("import sys");
- //添加Insert模块路径
- //PyRun_SimpleString(chdir_cmd.c_str());
- PyRun_SimpleString("sys.path.append('./')");
- //导入模块
- PyObject* pModule = PyImport_ImportModule("mytest");
- if (!pModule)
- {
- cout << "Python get module failed." << endl;
- return ;
- }
- cout << "Python get module succeed." << endl;
- PyObject * pFunc = NULL;
- pFunc = PyObject_GetAttrString(pModule, "Hello");
- PyEval_CallObject(pFunc, NULL);
- //获取Insert模块内_add函数
- PyObject* pv = PyObject_GetAttrString(pModule, "_add");
- if (!pv || !PyCallable_Check(pv))
- {
- cout << "Can't find funftion (_add)" << endl;
- return ;
- }
- cout << "Get function (_add) succeed." << endl;
- //初始化要传入的参数,args配置成传入两个参数的模式
- PyObject* args = PyTuple_New();
- //将Long型数据转换成Python可接收的类型
- PyObject* arg1 = PyLong_FromLong();
- PyObject* arg2 = PyLong_FromLong();
- //将arg1配置为arg带入的第一个参数
- PyTuple_SetItem(args, , arg1);
- //将arg1配置为arg带入的第二个参数
- PyTuple_SetItem(args, , arg2);
- //传入参数调用函数,并获取返回值
- PyObject* pRet = PyObject_CallObject(pv, args);
- if (pRet)
- {
- //将返回值转换成long型
- long result = PyLong_AsLong(pRet);
- cout << "result:" << result << endl ;
- }
- Py_Finalize();
- system("pause");
- return ;
- }
注意脚本放的位置,确保C++代码可以引用它。
运行结果:
3.python代码处理
在发布软件的时候,通常我们都不希望代码可以直接被别人看到。
以上的Debug目录中的exe要想能够单独运行,必须把python脚本拷过去。为了不让别人能直接看到我的代码,我拷过去的是生成的.pyc文件
拷过去之后修改文件名为:
实现了一个简单的python代码的加密。
不过据说可以反编译,但是对我来说已经够了。
C++调用Python脚本中的函数的更多相关文章
- .net 调用 Python脚本中的代码
使用工具:IronPython 工具介绍:是一种在 .NET 及 Mono上的 Python 实现,是一个开源的项目,基于微软的 DLR 引擎.(个人理解就是在 .net上面运行Python代码) 使 ...
- C++中调用Python脚本
C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了 先看Python的代码 代 ...
- C++中调用Python脚本(转载)
转载▼ 标签: 杂谈 C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库,需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了先看Py ...
- 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)
如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...
- $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境
在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...
- django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境
ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...
- Django框架(八)--单表增删改查,在Python脚本中调用Django环境
一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...
- c#调用python脚本实现排序(适用于python脚本中不包含第三方模块的情况)
引用:https://www.cnblogs.com/zoe-yan/p/10374757.html 利用vs2017c#调用python脚本需要安装IronPython.我是通过vs2017的工具- ...
- Python 调用JS文件中的函数
Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...
随机推荐
- testng日志 ITestListener
上一节我们写一个日志类 extends TestListenerAdapter ----------TestListenerAdapter 是 ITestListener 实现的一个类 这一节,我 ...
- Tfs更新 TfsConfig
Start TfsJobAgent TfsServiceControl unquiesce 更新serviving状态 TfsConfig diagnose /scope:updates TfsCon ...
- http协议中post方法发出请求
package com.chinaums.szm.test.base.igoodful; import com.fasterxml.jackson.databind.ObjectMapper;impo ...
- idea新建的项目,文件夹右键不能新建class
一般情况下,新建的mave项目,通常没有XXX\src\main\java这个目录,如果手动创建,则又不能右键build与java相关的,强行建立的话,也不会被idea所识别,更不会被虚拟机编译执行. ...
- 300. Longest Increasing Subsequence(LIS最长递增子序列 动态规划)
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- 150. Evaluate Reverse Polish Notation(逆波兰表达式)
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- java5引入的并发编程库
java5之后引入了java.util.concurrent包,专门用于解决java多线程问题. AtomicInteger用于解决原子性操作(i++,i--的问题): AtomicInteger ...
- MVP架构学习
MVP架构学习 M:数据层(数据库,文件,网络等...) V:UI层(Activity,Fragment,View以及子类,Adapter以及子类) P:中介,关联UI层和数据层,因为V和M是相互看不 ...
- JavaScript 事件处理详解
事件绑定与解绑: el.onEventName = function (){} document.getElementById("dom").onclick = function( ...
- [NOI2014]起床困难综合症(二进制+贪心)
题目 [NOI2014]起床困难综合症 做法 先用全\(0\)和全\(1\)去运行一下,再在满足\(m\)的限制下,贪心地从高位到低位选择即可