91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用C#/.net程序調用Python

發布時間:2023-03-02 14:10:24 來源:億速云 閱讀:134 作者:iii 欄目:開發技術

這篇文章主要介紹了怎么使用C#/.net程序調用Python的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么使用C#/.net程序調用Python文章都會有所收獲,下面我們一起來看看吧。

C#/.net程序調用python

C#的優勢在于window下的開發,不僅功能強大而且開發周期短。而python則有眾多的第三方庫,可以避免自己造輪子,利用C#來做界面,而具體實現使用python來實現可以大大提高開發效率。本文介紹如何使用pythonnet來執行python腳本,使用pythonnet既可以具有較高的交互性,又可以使用第三方python庫,同時可以將程序需要的python環境及第三方庫打包到軟件中,避免用戶進行python的環境配置。

C#調用python的常見方法

調用python常見的方法有4種

方式優點缺點
使用IronPython無需安裝python運行環境,交互性強,C#和python無縫連接某些python第三方庫不支持,如numpy
使用C++調用Python,然后將C++程序做成動態鏈接庫交互性較強需要用戶配置Python環境,實現方式復雜
利用C#命令行調用py文件執行速度快需要用戶配置Python環境,交互性差
將python文件打包成exe進行調用無需安裝python運行環境,執行速度慢,傳遞數據復雜,交互性差

可以看出4種方式均有限制,很難同時滿足:交互性強、可調用第三方python庫、無需用戶配置Python環境要求,而這幾項要求恰恰是一款成熟軟件所必須的。而使用pythonnet庫可滿足以上三點要求。

本文均在.net 6環境下測試

使用pythonnet

  • Nuget安裝pythonnet

  • 設置Runtime.PythonDLL屬性,即pythonxx.dll路徑,xx為版本號

  • 設置PythonEngine.PythonHome,即python.exe所在路徑

  • 設置PythonEngine.PythonPath,python腳本所在目錄,可以放置多個路徑,以分號隔開,但是pathToVirtualEnv\Lib\site-packages和pathToVirtualEnv\Lib應放在最后

  • 調用PythonEngine.Initialize();

string pathToVirtualEnv = ".\\envs\\pythonnetTest";
Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");
PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");
PythonEngine.PythonPath = $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib";
PythonEngine.Initialize();
//調用無參無返回值方法
using (Py.GIL()) //執行python的調用應該放在using (Py.GIL())塊內
{
    //python對象應聲明為dynamic類型
    dynamic np = Py.Import("test");
    np.hello();
}
//調用有參有返回值方法
using (Py.GIL())
{
    dynamic np = Py.Import("test");
    int r = np.add(1, 2);
    Console.WriteLine($"計算結果{r}");
}

python文件,必須放在PythonEngine.PythonPath設定的目錄下

def hello():
    print("hello")

def add(a,b):
    return a+b

嵌入Python環境及使用第三方庫

程序中包含Python腳本所需要的所有環境以及第三方庫可以免去用戶的自定義配置。本文使用Anaconda來構建專用的虛擬環境。

  • 創建專用虛擬環境(windows下首先切換到要建立虛擬環境的根目錄下),執行conda create --prefix=F:\condaenv\env_name python=3.7路徑及python版本根據需要自定義。

  • 使用Anaconda Prompt,激活虛擬環境conda activate F:\condaenv\env_name

  • 本次測試第三方庫Numpy(如果需要其他庫,安裝方法相同),安裝Numpypip install numpy

string pathToVirtualEnv = ".\\envs\\pythonnetTest";
Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");
PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");
PythonEngine.PythonPath = $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib";
PythonEngine.Initialize()
//使用第三方庫
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 = (double)(np.cos(5) + sin(5));
    Console.WriteLine(c);

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

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

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

怎么使用C#/.net程序調用Python

注意:C#和python對象進行數學運算時,必須將Python對象放到前面,例如np.pi*2,不能是2*np.pi

傳遞對象

可以將C#對象傳遞到python中

在C#中定義對象

public class Person
{
    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}
string pathToVirtualEnv = ".\\envs\\pythonnetTest";
Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");
PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");
PythonEngine.PythonPath = $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib";
PythonEngine.Initialize();
//將C#中定義的類型傳入python
using (Py.GIL()) 
{
    Person p = new Person("John", "Smith");
	PyObject pyPerson = p.ToPython();
	string r1 = test.FullName(pyPerson);
	Console.WriteLine($"全名:{r1}");
}

python腳本

def FullName(p):
    return p.FirstName+""+p.LastName

怎么使用C#/.net程序調用Python

調用pyd文件

pyd文件主要有以下2點作用:

  • 安全性更高:通過pyd生成的文件,已變成了dll文件,無法查看源碼

  • 編譯成pyd后,性能會有提升

將.py文件編譯成pyd文件步驟如下:

1.pip install cython

2.在.py文件目錄下創建setup.py文件

from distutils.core import setup
from Cython.Build import cythonize

setup(
name = "testName",
ext_modules = cythonize("test.py"), #將test.py文件編譯成pyd
)

3.執行編譯命令

python setup.py build_ext --inplace

最后生成的pyd文件一般是test+cpython版本-平臺為文件名,可以重命名為test名稱,也可以不管,使用時仍然可以按test調用。

調動pyd文件和調用py文件相同,但是執行效率大大增強,下文會對執行速度進行對比。

執行速度對比

在test.py中定義一個耗時函數

import time


def Count():
    start = time.perf_counter()

    sum = 0
    for i in range(10000):
        for j in range(10000):
            sum = sum + i + j
    print("sum = ", sum)

    end = time.perf_counter()
    runTime = end - start
    runTime_ms = runTime * 1000

    print("運行時間:", runTime, "秒")

直接執行test.py腳本

運行結果如下:

怎么使用C#/.net程序調用Python

在C#中調用Conut()函數

//運行時間測試
Console.WriteLine("C#開始計時");
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
test.Count();
stopWatch.Stop();
Console.WriteLine($"C#計時結束{stopWatch.ElapsedMilliseconds}");

執行結果如下:

怎么使用C#/.net程序調用Python

可以看到,使用pythonnet調用python腳本會有一定的性能損失,不過在對性能要求不是十分高的條件下是可以接受的。

執行test.pyd文件

運行結果如下:

怎么使用C#/.net程序調用Python

從結果可以看出調用pyd比原生的py文件執行還要快,所以可以使用pythonnet來執行pyd文件,即實現代碼保護又提升了執行效率。

關于“怎么使用C#/.net程序調用Python”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“怎么使用C#/.net程序調用Python”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

迁安市| 边坝县| 诸城市| 盐源县| 水城县| 伊吾县| 陵水| 施秉县| 永城市| 九江县| 大同市| 修文县| 吴桥县| 黔江区| 富裕县| 天等县| 临洮县| 运城市| 罗定市| 清涧县| 科技| 伊川县| 清新县| 中西区| 辛集市| 邹城市| 古蔺县| 吉首市| 南岸区| 通许县| 泰州市| 东乌| 名山县| 泸溪县| 封丘县| 东平县| 新竹市| 招远市| 抚顺县| 商南县| 信阳市|