一、為什麼要在C#中調用Python腳本?
在C#開發中,Python可以作為一種腳本語言來應用,其優勢在於:Python擁有強大的科學計算、數據處理以及自然語言處理等能力,在某些領域中的應用非常廣泛。同時,Python的語法簡單易學,可讀性強,非常適合快速編寫和測試相關的演算法和模型。
因此,將Python腳本引入到C#程序中,可以為C#程序功能的擴展提供巨大的便捷!
二、如何在C#中調用Python腳本?
1. 使用System.Diagnostics.Process啟動Python
using System.Diagnostics;
Process.Start("python.exe", "Test.py");
這種方法是啟動一個新進程來執行Python腳本。
其中,python.exe
是Python的解釋器,Test.py
是你要執行的Python腳本的路徑。
2. 使用IronPython運行Python腳本
IronPython是一種在.NET平台上運行的Python實現。通過將IronPython引入到你的C#項目中,可以更方便地調用Python腳本。
IronPython
安裝方法:
通過NuGet安裝:
Install-Package IronPython -Version 2.7.9
也可以手動從IronPython官網下載安裝。
IronPython
調用Python腳本示例:
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
class Program
{
static void Main(string[] args)
{
var engine = Python.CreateEngine();
var scope = engine.CreateScope();
var source = engine.CreateScriptSourceFromFile("Test.py");
source.Execute(scope);
dynamic function = scope.GetVariable("function");
int result = function(3, 5);
Console.WriteLine("Result is: " + result.ToString());
}
}
其中,Python.CreateEngine()
創建Python運行引擎,CreateScope()
創建一個Python範圍,CreateScriptSourceFromFile()
方法讀取Python代碼文件,Execute(scope)
方法執行Python代碼,用GetVariable()
獲取Python代碼中定義的變數。
三、Python腳本如何與C#交互?
1. Python返回結果給C#
#Test.py
def function(a, b):
return a+b
//C#代碼
dynamic function = scope.GetVariable("function");
int result = function(3, 5);
Console.WriteLine("Result is: " + result.ToString());
這裡我們在Python腳本里定義了一個函數function(a, b)
,並返回了a+b
。在C#代碼中,我們可以調用Python腳本的function()
函數,並將結果返回給C#端。
2. C#向Python傳遞數據
在C#中向Python傳遞數據,要使用動態粘合(dynamic binding)特性。下面以C#向Python傳遞列表為例:
//Test.py
import sys
list = sys.stdin.readlines()
print(list)
//C# 代碼
var engine = Python.CreateEngine();
var scope = engine.CreateScope();
var source = engine.CreateScriptSourceFromString("import sys\nlist = sys.stdin.readlines()\nprint(list)");
var list = new List<string> { "a", "b", "c" };
engine.GetBuiltinModule().SetVariable("sys", PythonImport("sys"));
var stdin = engine.Runtime.IO.GetDynamicConsole().In;
var originalIn = stdin.Swap(new ListStream(list));
source.Execute(scope);
在這段代碼中,我們使用CreateScriptSourceFromString()
方法將Python字元串傳遞給Python解釋器。通過stdin
,我們將列表list
傳遞給Python腳本,Python解釋器會將列表list
讀入到sys.stdin
中。在Python腳本中,我們可以將數據讀取並輸出。
四、Python模塊和庫在C#中的應用
Python擁有豐富的模塊和庫,包括numpy、pandas、scikit-learn、tensorflow等等。將Python模塊和庫引入到C#項目中,可以為我們提供更高效、更便捷的科學計算和機器學習能力。
//在C#中引用numpy庫
var engine = Python.CreateEngine();
var scope = engine.CreateScope();
engine.Execute("import numpy as np", scope);
var np = scope.GetVariable("np");
var a = np.array(new List<dynamic> { 1, 2, 3 });
var b = np.array(new List<dynamic> { 4, 5, 6 });
var c = np.dot(a, b);
在這段代碼中,我們使用numpy
庫中的dot()
函數計算兩個數組的點積。通過在C#代碼中引用numpy
庫,我們獲得了這些強大的計算功能。
五、AbbyyLingvoLive API
AbbyyLingvoLive API是ABBYY公司提供的一款在線詞典服務,可以提供79種語言之間的快速翻譯功能。下面我們將展示如何使用C#調用Python腳本,來使用AbbyyLingvoLive API。
AbbyyLingvoLive API
調用Python腳本示例:
//翻譯源語言
var engine = Python.CreateEngine();
var scope = engine.CreateScope();
var source = engine.CreateScriptSourceFromString("import requests as req\nr = req.get('https://developers.lingvolive.com/api/v1.1/authenticate', headers={'Authorization': 'Basic '+AuthKey})\nif r.status_code == 200:\n token = r.text\n headers = {'Authorization': 'Bearer '+token}\n params = {'text': 'Hello world!', 'srcLang': 'en', 'dstLang': 'zh', 'isCaseSensitive': False}\n url = 'https://developers.lingvolive.com/api/v1/Minicard'\n r = req.get(url, headers=headers, params=params)\n if r.status_code == 200:\n result = r.json()\n print(result['Translation']['Translation']))");
dynamic AuthKey = "your_AuthKey";
engine.Execute(source);
在這段代碼中,我們使用requests
庫來進行API調用。我們首先需要通過requests.get()
方法來進行用戶身份驗證。驗證成功後,會返回訪問令牌。接著,我們使用requests.get()
方法來進行翻譯。通過json
方法,我們將結果解析成JSON格式,並輸出翻譯結果。這樣就完成了使用Python腳本來使用AbbyyLingvoLive API的流程。
六、總結
本文詳細介紹了在C#中調用Python腳本的各種方法和技巧。通過深入了解這些技術,可以幫助我們更好地理解使用Python在C#項目中的應用場景,並為我們的開發工作提供巨大的便捷。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/227621.html