1.环境配置

安装完python后,把python的include和lib拷贝到自己的工程目录下

然后在工程中包括进去

2.例子

先写一个python的测试脚本,如下

这个脚本里面定义了两个函数Hello()和_add()。我的脚本的文件名叫mytest.py

C++代码:

  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. #include <iostream>
  4.  
  5. #include "include\Python.h"
  6.  
  7. using namespace std;
  8.  
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11. //初始化Python环境
  12. Py_Initialize();
  13.  
  14. PyRun_SimpleString("import sys");
  15. //添加Insert模块路径
  16. //PyRun_SimpleString(chdir_cmd.c_str());
  17. PyRun_SimpleString("sys.path.append('./')");
  18.  
  19. //导入模块
  20. PyObject* pModule = PyImport_ImportModule("mytest");
  21.  
  22. if (!pModule)
  23. {
  24. cout << "Python get module failed." << endl;
  25. return ;
  26. }
  27.  
  28. cout << "Python get module succeed." << endl;
  29.  
  30. PyObject * pFunc = NULL;
  31. pFunc = PyObject_GetAttrString(pModule, "Hello");
  32. PyEval_CallObject(pFunc, NULL);
  33.  
  34. //获取Insert模块内_add函数
  35. PyObject* pv = PyObject_GetAttrString(pModule, "_add");
  36. if (!pv || !PyCallable_Check(pv))
  37. {
  38. cout << "Can't find funftion (_add)" << endl;
  39. return ;
  40. }
  41. cout << "Get function (_add) succeed." << endl;
  42.  
  43. //初始化要传入的参数,args配置成传入两个参数的模式
  44. PyObject* args = PyTuple_New();
  45. //将Long型数据转换成Python可接收的类型
  46. PyObject* arg1 = PyLong_FromLong();
  47. PyObject* arg2 = PyLong_FromLong();
  48.  
  49. //将arg1配置为arg带入的第一个参数
  50. PyTuple_SetItem(args, , arg1);
  51. //将arg1配置为arg带入的第二个参数
  52. PyTuple_SetItem(args, , arg2);
  53.  
  54. //传入参数调用函数,并获取返回值
  55. PyObject* pRet = PyObject_CallObject(pv, args);
  56.  
  57. if (pRet)
  58. {
  59. //将返回值转换成long型
  60. long result = PyLong_AsLong(pRet);
  61. cout << "result:" << result << endl ;
  62. }
  63.  
  64. Py_Finalize();
  65.  
  66. system("pause");
  67.  
  68. return ;
  69. }

注意脚本放的位置,确保C++代码可以引用它。

运行结果:

3.python代码处理

在发布软件的时候,通常我们都不希望代码可以直接被别人看到。

以上的Debug目录中的exe要想能够单独运行,必须把python脚本拷过去。为了不让别人能直接看到我的代码,我拷过去的是生成的.pyc文件

拷过去之后修改文件名为:

实现了一个简单的python代码的加密。

不过据说可以反编译,但是对我来说已经够了。

C++调用Python脚本中的函数的更多相关文章

  1. .net 调用 Python脚本中的代码

    使用工具:IronPython 工具介绍:是一种在 .NET 及 Mono上的 Python 实现,是一个开源的项目,基于微软的 DLR 引擎.(个人理解就是在 .net上面运行Python代码) 使 ...

  2. C++中调用Python脚本

    C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了 先看Python的代码 代 ...

  3. C++中调用Python脚本(转载)

    转载▼ 标签: 杂谈 C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库,需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了先看Py ...

  4. 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)

    如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...

  5. $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

    在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...

  6. django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境

    ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...

  7. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  8. c#调用python脚本实现排序(适用于python脚本中不包含第三方模块的情况)

    引用:https://www.cnblogs.com/zoe-yan/p/10374757.html 利用vs2017c#调用python脚本需要安装IronPython.我是通过vs2017的工具- ...

  9. Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

随机推荐

  1. testng日志 ITestListener

    上一节我们写一个日志类 extends   TestListenerAdapter ----------TestListenerAdapter 是 ITestListener 实现的一个类 这一节,我 ...

  2. Tfs更新 TfsConfig

    Start TfsJobAgent TfsServiceControl unquiesce 更新serviving状态 TfsConfig diagnose /scope:updates TfsCon ...

  3. http协议中post方法发出请求

    package com.chinaums.szm.test.base.igoodful; import com.fasterxml.jackson.databind.ObjectMapper;impo ...

  4. idea新建的项目,文件夹右键不能新建class

    一般情况下,新建的mave项目,通常没有XXX\src\main\java这个目录,如果手动创建,则又不能右键build与java相关的,强行建立的话,也不会被idea所识别,更不会被虚拟机编译执行. ...

  5. 300. Longest Increasing Subsequence(LIS最长递增子序列 动态规划)

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  6. 150. Evaluate Reverse Polish Notation(逆波兰表达式)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  7. java5引入的并发编程库

    java5之后引入了java.util.concurrent包,专门用于解决java多线程问题.   AtomicInteger用于解决原子性操作(i++,i--的问题): AtomicInteger ...

  8. MVP架构学习

    MVP架构学习 M:数据层(数据库,文件,网络等...) V:UI层(Activity,Fragment,View以及子类,Adapter以及子类) P:中介,关联UI层和数据层,因为V和M是相互看不 ...

  9. JavaScript 事件处理详解

    事件绑定与解绑: el.onEventName = function (){} document.getElementById("dom").onclick = function( ...

  10. [NOI2014]起床困难综合症(二进制+贪心)

    题目 [NOI2014]起床困难综合症 做法 先用全\(0\)和全\(1\)去运行一下,再在满足\(m\)的限制下,贪心地从高位到低位选择即可