pythonnet c#调用并集成python代码

基本配置:
win7 cpu
Anaconda3-4.0.0-Windows-x86_64+python 3.5.1
pythonnet-master
vs2017

优点:C#调用python代码时不用安装代码中import的各种python包

Anaconda3-4.0.0-Windows-x86_64.exe
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
(目前pythonnet不支持最新的python3.7)
非常重要的注意点:这里安装好Anaconda后不再创建tensorflow环境,直接在默认环境下pip install tensorflow等python包(在安装好anaconda后不要执行conda create -n tensorflow python=3.5来创建tensorflow环境,因为很多其他开源库像pythonnet调用的默认的python而不是其他环境下的python,至于如何调用其他环境下的python目前还无法做到)(经测试import keras的python代码在c#里无法调用,但是可以使用tensorflow.keras来使用keras;用纯keras框架训练的权重,可以直接用tf.keras来读取并用来预测)
其他注意点:若import numpy出现ImportError : Something is wrong with the numpy installation.错误,pip uninstall numpy,conda uninstall numpy,pip install numpy

根据以下网址进行环境变量的增加环境变量
https://www.jianshu.com/p/a6e908ed199c
桌面-计算机-属性-高级系统设置-环境变量-系统变量-path里需要有
C:\Anaconda3;C:\Anaconda3\Scripts(安装Anaconda3的目录)
并在系统变量里新建变量名为PYTHONPATH,变量值为
C:\Anaconda3\DLLs;C:\Anaconda3\Lib;C:\Anaconda3\Lib\site-packages

下载pythonnet-master,download zip,然后解压
https://github.com/pythonnet/pythonnet
在解压后的pythonnet-master文件夹用vs打开pythonnet.sln,打开解决方案的Python.Runtime项目的属性,点击 生成-条件编译符号 改成 PYTHON3;PYTHON35;UCS2,平台目标改成x64,然后生成,生成时选择DebugWin和x64。(该操作生成之后需要在其他项目中引入的dll文件)依然在pythonnet.sln这个解决方案中增加一个控制台项目命名为pythonnet-test,添加引用-项目-勾选Python.Runtime,右击项目属性-生成-平台目标改成x64。

然后就可以把https://github.com/pythonnet/pythonnet最下面的代码添加到这个pythonnet-test项目,如下图

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Python.Runtime;

namespace pythonnet_test
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Py.GIL())
            {
                dynamic np = Py.Import("numpy");
                Console.WriteLine(np.cos(np.pi * 2));

                dynamic sin = np.sin;
                Console.WriteLine(sin(5));

                double c = np.cos(5) + sin(5);
                Console.WriteLine(c);

                dynamic a = np.array(new List { 1, 2, 3 });
                Console.WriteLine(a.dtype);

                dynamic b = np.array(new List { 6, 5, 4 }, dtype: np.int32);
                Console.WriteLine(b.dtype);

                Console.WriteLine(a * b);
                Console.ReadKey();
            }
        }
    }
}

生成选项选择DebugWin和x64

控制台输出如下所示:
1.0
-0.958924274663
-0.6752620892
float64
int32
[ 6. 10. 12.]

你可能感兴趣的:(深度学习)