C++调用Python(Pyc)

本文介绍如何通过C++工程调用Python编译后的.pyc文件,包括PythonLib.py文件的编写、编译生成.pyc文件的过程及C++代码的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:本文默认已经正确安装Python3.4

1.编辑PythonLib.py文件,内容如下(主要定义了两个函数):


2.运行cmd窗口,定位到PythonLib.py文件所在目录,(我的在E:\PythonPro\PythonLib\PythonLlib\PythonLib中):

3.生成XX.pyc文件

在cmd窗口中输入python -m py_compile PythonLib.py

如下:


执行完后在当前目录中生成__pycache__文件夹,其中有.pyc文件,将其更名问PythonLib.pyc

4.新建C++工程sample,将Python3.4的include文件夹和libs文件夹复制到这个工程目录下

5.属性-链接器-常规-附加库目录,添加libs的路径

6.属性-链接器-附加依赖项,添加Python34.Lib

7.sample.cpp中的代码

#include "stdafx.h"
#include "include/Python.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	Py_Initialize();
	if ( !Py_IsInitialized() )
	{  
		return -1;  
	}  
	PyObject *pModule,*pFunc,*pArgs;
	pModule = PyImport_ImportModule("PythonLib");//PythonLib:Python文件名
	pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python文件中的函数名

	//创建参数:
	pArgs = PyTuple_New(2);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数
	PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序号,i表示创建int型变量
	PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序号
	//返回值
	PyObject *pReturn = NULL;
	pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数
	//将返回值转换为int类型
	int result;
	PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量
	cout << "6 + 8 = " << result << endl;

	// 关闭Python  
	int i;
	cin>>i;
	return 0;
}
8.将步骤3生成的PythonLib.pyc复制到工程目录下,运行程序


成功调用了pyc文件



### 关于C++调用Python时是否需要将Python代码加密并编译为pyc文件 在讨论C++调用Python的过程中,关于是否需要将Python代码加密并编译为`.pyc`文件这一问题,可以从以下几个方面分析: #### 1. **Python代码的解释与执行** Python是一种解释型语言,在运行过程中会先将`.py`文件编译为字节码形式(即`.pyc`文件),然后再由Python虚拟机解释执行。这种机制使得`.pyc`文件成为了一种中间产物,主要用于加速程序启动时间而非安全目的[^1]。 #### 2. **安全性需求** 如果目标是在外部环境中分发Python代码,并希望保护其源码不被轻易查看,则仅依赖`.pyc`文件可能不够充分,因为`.pyc`文件相对容易反编译回接近原始的Python代码[^4]。为了增强安全性,可以考虑使用更高级别的加密手段,例如通过Cython将Python代码编译为C扩展模块(生成`.so`或`.pyd`文件)。这种方式不仅提高了性能,还显著增加了反编译难度[^2]。 #### 3. **C++调用Python的方式** 当C++应用程序需要调用Python脚本时,通常有以下几种方法: - 使用嵌入式Python API直接加载和执行Python脚本。 - 将Python逻辑封装为独立的服务或库供C++调用。 无论采用哪种方式,都可以选择对Python代码进行预处理以满足特定的安全性和性能需求。对于高敏感度的应用场景,推荐利用Cython等工具将核心业务逻辑转化为二进制形式后再集成到C++项目中[^3]。 以下是基于Cython实现的一个简单示例流程: ```cpp // 假设我们已经有一个名为example.pyx的Cython文件 #include <Python.h> int main() { Py_Initialize(); // 初始化Python解释器 PyObject* pName = PyUnicode_DecodeFSDefault("example"); // 加载module名 PyObject* pModule = PyImport_Import(pName); // 导入module if (pModule != NULL) { // 如果导入成功 PyObject* pFunc = PyObject_GetAttrString(pModule, "my_function"); if (pFunc && PyCallable_Check(pFunc)) { // 获取函数指针 PyObject_CallObject(pFunc, NULL); // 调用该函数 } } Py_Finalize(); // 结束Python解释器 return 0; } ``` 此代码片段展示了如何从C++端初始化Python环境并通过PyImport_Import接口引入预先构建好的Cython模块。注意这里假设存在一个叫做`example.pyd`(Windows下)或者`example.so`(Linux/MacOS下)的目标文件作为桥梁连接两者之间的通信渠道[^1]。 ### 总结 综上所述,在大多数情况下并不强制要求把Python源码转存成.pyc格式再交给C++去读取;但如果确实关心知识产权泄露风险的话,则建议采取更为严格的措施——借助诸如Cython之类的框架完成最终交付物形态转变工作(如.so/.pyd),从而达到兼顾效率的同时又能有效遏制非法窥探企图的目的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值