@TOC

前言

最近在做一个项目,涉及到了如何用C#调用Python文件。汇总了一下网上找来的资料,具体参考了这篇博客c#调用python的四种方法(尝试了四种,只详细讲解本人成功的后两种,其余方法只列出,详细用法请自行谷歌百度)
对于第一种方法,使用IronPython2.7的方法,我找到了更详细的博客C#如何调用Python执行脚本,并将执行结果显示值显示至C#界面,不过Python2.7可能无法满足我们项目的需求,当然我也找到了类似的另外两种可以使用Python3的方法,还没有试过,在这里提供给大家参考C#使用公共语言拓展(CLE)调用Python3(使用TensorFlow训练的模型)pythonnet c#调用并集成python代码
对于第三和第四种方法,因为要使用命令行窗口,而且还要考虑不同用户的python安装情况如何,在项目实际使用时效果肯定是很不好的,所以在这里不做过多的介绍,原博主也给出了他自己的源代码,大家可以自己尝试一下。
重点说一下第二种方法。我在CSDN上找了好多博客,大家的方法都大同小异,可能真的是看人品吧,我试了好几次都失败了,最后在朋友的帮助下才成功……

配置环境

这里先说一下,我是win10+VS2017+Python3.7.4。

第一步新建一个控制台项目,修改属性页

选择Debug|x64
在这里插入图片描述第一个修改的是C/C++——常规——附加包含目录:添加你所安装的Python目录下的include目录路径。
在这里插入图片描述第二个修改的是链接器——常规——附加库目录:添加你所安装的Python目录下的libs目录路径。

第二步修改Python安装目录下文件

在这里插入图片描述
找到Python安装目录,找到libs目录复制python37.lib到本目录,改名为python37_d.lib。

代码测试

现在我们可以来简单测试一下

测试用Python3语法输出“Hello World!”

我们定义一个print(),里面用了Python3的语法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "pch.h"
#include <Python.h>
#include <iostream>

using namespace std;

void print()
{
Py_Initialize();
PyRun_SimpleString("print('Hello World!')\n");//Python3语法
Py_Finalize();
}

int main()
{
print();
return 0;
}

测试用Python文件输出“Hello World!”

定义一个Hello(),里面调用了Test001.py文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "pch.h"
#include <Python.h>
#include <iostream>

using namespace std;

void print()
{
Py_Initialize();
PyRun_SimpleString("print('Hello Python!')\n");
Py_Finalize();
}

void Hello()
{
Py_Initialize();//调用Py_Initialize()进行初始化
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//调用的Python文件名
pFunc = PyObject_GetAttrString(pModule, "Hello");//调用的函数名
PyEval_CallObject(pFunc, NULL);//调用函数,NULL表示参数为空
Py_Finalize();//调用Py_Finalize,和Py_Initialize相对应的.
}

int main()
{
print();
Hello();
return 0;
}

Test001.py文件内容如下:

1
2
def Hello():
print("Hello World!")

注意,要把Test001.py文件放到ConsoleApplication1.exe同级目录
在这里插入图片描述
在这里插入图片描述

结尾

如果一切顺利的话,那你现在已经在控制台看到输出了;如果不顺利的话,可以找找其他的博客,或者换一个方法,不要拘泥于这一个思路……
从今天开始,这个博客会把我之前做项目遇到的一些问题的解决办法总结一下,也算是一种积累吧,估计等我项目做完,会写成一本《扑街实录》。

引用

c#调用python的四种方法(尝试了四种,只详细讲解本人成功的后两种,其余方法只列出,详细用法请自行谷歌百度)
C#如何调用Python执行脚本,并将执行结果显示值显示至C#界面
C#使用公共语言拓展(CLE)调用Python3(使用TensorFlow训练的模型)
pythonnet c#调用并集成python代码