南昌做网站开发的公司哪家好,东阳网站建设有哪些,锦州哪里做网站,免费动态图片素材网站步骤一#xff1a;在Anaconda中创建虚拟环境 这一点对大家来说应该很简单#xff0c;简单介绍一下#xff0c;不做过多解释。值得注意的是#xff0c;要用conda命令创建环境#xff0c;用pip install配置环境。
conda create -n c_python_env python3.9 # 用conda创建pyt…步骤一在Anaconda中创建虚拟环境 这一点对大家来说应该很简单简单介绍一下不做过多解释。值得注意的是要用conda命令创建环境用pip install配置环境。
conda create -n c_python_env python3.9 # 用conda创建python虚拟环境
conda activate c_python_env # 激活该虚拟环境
pip install numpy # 在虚拟环境中用pip安装python包
在Anaconda的安装目录下可以看到如下文件夹就是我们新创建的环境 步骤二在VS2017中创建一个C项目: C_Python 具体过程不再赘述在项目中创建一个文件“c_python_test.cpp”添加以下内容
c_python_test.cpp
#include Python.h
#include iostream
#include string
using namespace std;int main_()
{ //1. 初始化Py_Initialize();//使用python之前要调用Py_Initailize函数进行初始化if (!Py_IsInitialized){printf(初始化失败);return 0;}PyRun_SimpleString(print(hello world));PyRun_SimpleString(import numpy as np);Py_Finalize();system(pause);return 0;
} 步骤三在VS2017中配置Anaconda创建的python环境
VS2017的设置如下 1在VS的项目属性配置属性VC目录包含目录中将Anaconda虚拟环境的根目录下的include文件夹添加进来 2在VS的项目属性配置属性VC目录 库目录中将Anaconda虚拟环境的根目录下的libs文件夹添加进来 3然后在VS的项目属性配置属性链接器输入附加依赖项中Anaconda虚拟环境的根目录下的libs/python39_d.lib添加上。如果没有python39_d.lib文件就把python39.lib复制一份重命名为python39_d.lib。 4拷贝Anaconda虚拟环境的根目录下的“DLLs”和“Lib”两个文件夹复制到exe所在文件夹x64/Release。没有exe文件夹就先编译生成一个。这一步很重要否则C无法找到虚拟环境中的第三方依赖库比如我们上面安装的numpy库。 拷贝到 5如果有必要把Anaconda虚拟环境中的python3.lib、python39.lib和python39_d.lib也拷贝到exe所在文件夹x64/Release。再一次如果环境中没有python39_d.lib文件就把python39.lib复制一份重命名为python39_d.lib。在我的测试中这一步不执行也没问题 拷贝到 步骤四 在VS2017中生成并运行项目
得到以下输出表示设置成功。 升级--步骤五创建python工程py_scriptC引入python脚本 假设python脚本的绝对路径为D:/wzg_projects/C_Python/py_script具体在哪里无所谓。创建以下两个python脚本
demo.py
import numpy as np def formula1(A,F):print(A,F)return np.array(A*F) hello.py
import demo as d def func(a,b):num d.formula1(10,20)print(result {}.format(num))print(hello world)
在VS2017中更改 c_python_test.cpp 脚本的内容
c_python_test.cpp #include iostream
#include Python.h
#include string
using namespace std;int main_()
{// 1. 开始python与c的接口模块初始化。Py_Initialize();//使用python之前要调用Py_Initailize函数进行初始化if (!Py_IsInitialized()){printf(python与c的接口模块初始化失败);return 0;}// 2. 可行性的基础验证测试成功后可注释掉//PyRun_SimpleString(print(hello world));//PyRun_SimpleString(import numpy as np);// 3. 添加python脚本的搜索路径PyRun_SimpleString(import sys);PyRun_SimpleString(sys.path.append(D:/wzg_projects/C_Python/py_script));// 4. 定义pythonObject类对象并实例化前向计算PyObject* pModule NULL;PyObject* pFunc NULL;// 1)pModule实例化pModule PyImport_ImportModule(hello);//通过python文件名寻找python脚本文件名不用加后缀把python脚本编码为c格式if (pModule NULL) // 如果找不到文件就报错{cout 没找到python脚本hello.py endl;return 0;}// 2) pFunc 实例化pFunc PyObject_GetAttrString(pModule, func);//从pModule脚本中提取名字为“func”的函数封装为c格式的pFunc函数if (!pFunc || !PyCallable_Check(pFunc)) {cout 没找到python函数func endl;return 0;}// 3) 把C变量转变成Python格式// i) 参变量的定义方式1//PyObject* pArgs Py_BuildValue(ii, 25, 6); // 定义函数的参变量。ii表示定义两个int类型的变量。还有许多其他格式可以具体情况具体改变。// ii) 参变量的定义方式2--推荐使用PyObject* pArgs PyTuple_New(2);PyTuple_SetItem(pArgs, 0 ,Py_BuildValue(i, 25)); // 把一个int类型的数据“25”放在python tuple的索引为0的位置。PyTuple_SetItem(pArgs, 1, Py_BuildValue(i, 6)); // 把一个int类型的数据“25”放在python tuple的索引为0的位置。// 4) 运行python函数PyObject* pReturn PyObject_CallObject(pFunc, pArgs); // 运行python函数计算函数的输出结果。把参数args2输入到函数pFunc中计算输出结果存储到pRet中。// 5. 把python格式的数据转变成c格式int cReturn 0;PyArg_Parse(pReturn, i, cReturn);//注意PyArg_Parse的最后一个参数必须加上“”符号。“i”表示转变成int类型的变量。cout cReturn: cReturn endl;// 6. 结束python与c的接口模块Py_Finalize();system(pause);return 0;
} 重新生成项目运行可以实现对python脚本的调用。具体如何调用请看上面的代码注释还是比较详细的。
提示与思考 如果python脚本中存在bug无法运行或找不到依赖库c脚本仍旧可以顺利编译成功但是在运行时会提示无法找到python文件比如无法找到上面的“hello.py”步骤三中的过程----拷贝Anaconda虚拟环境的根目录下的“DLLs”和“Lib”两个文件夹复制到exe所在文件夹x64/Release。没有exe文件夹就先编译生成一个。这一步很重要否则C无法找到虚拟环境中的第三方依赖库比如我们上面安装的numpy库。 这一步不可省略。经试验把这两个文件夹添加到vs2017的库目录中也无法解决这个问题。在步骤五的c_python_test.cpp脚本中需要设置python脚本的寻找路径防止C找不到python脚本。为了未来的可扩展性、易用性和可移植性或许这一步可以通过cmake、qt等方式以自动化的方式解决。应该编写一个接口函数用于c和python相互传递参数并把这个函数固定下来。linux环境下没有vs2017应该如何设置c的python依赖库呢用cmake编译好 参考及进一步学习
[1] C调用python方法及环境配置Windows环境、VS工具
[2] C调用Python遇到的问题总结anaconda的虚拟环境、使用python第三方库如pytorch、pytorch geometric [3] C调用Python混合编程函数整理总结
[4] C调用python脚本
[5] C/C 调用Python
[6] C调用python 之 环境配置(VS2015 anaconda)
[7] C调用python文件包含第三方库
更多扩展教程
[1] 图像处理深度学习python代码改写成c推理
[2] python调用C中的函数【最简明教程】
[3] [pybind11]为c项目写python API接口 - 知乎
[4] C和python的代码如何相互调用 - 知乎