詳解c 與python的互動方式

2022-09-27 03:18:11 字數 4314 閱讀 7954

在平時工作中,需求有多種實現方式;根據不同的需求可以採用不同的程式語言來實現。發揮各種語言的強項

如:python的強項是:資料分析、人工智慧等

.net 開發桌面程式介面比python更簡單、方便、美觀

那麼就存在各種語言間互動,本篇主要介紹幾種c# 與 python的互動方式。

1、ironpython是什麼?  

ironpython是python程式語言的開源實現,該語言與.net framework緊密整合。ironpython可以使用.net framework和python庫,而其他.net語言也可以輕鬆使用python**。

2、irconpython如何使用

a) 新增包引用:

install-package ironpython -程式設計客棧version 2.7.11

b) 執行簡單python指令碼: 

//建立執行引擎

scriptengine engine = python.createengine();

scriptscope scope = engine.createscope();

string script = "'hello %d' %number";

//設定引數列表

scope.setvariable("number", 123);

scriptsource sourcecode = engine.createscriptsourcefromstring(script);

var result = sourcecode.execute(scope);

c) 執行python檔案方法:

新增如下簡單python檔案:demo.py

#檔案目錄 demo.py

import time

def welcome(name):

return "hello " + name

def add(a, b):

return a + b

def showmsg(name,birthday):

return "姓名:" + name + ",生日:" + birthday

執行方法:

string path = @"demo.py";

scriptruntime pyruntime = python.createruntime(); //建立一下執行環境

dynamic obj = pyruntime.usefile(path);

//呼叫python中add函式

object sum = obj.add(1, 54);

d) 執行python檔案方法(依賴三方庫):

from scipy import linalg

import numpy as np

import json

def calcnum(jsoninput):

a = np.array([[1, 1, 7], [2, 3, 5], [4, 2, 6]]) # a代表係數矩陣

b = np.array([2, 3, 4]) # b代表常數列

x = linalg.solve(a, b)

# json字串轉物件

info = json.loads(jsoninput)

print(info['a'])

# 物件轉json字串

output = json.dumps(info)

print(output)

程式設計客棧print(x)

執行結果: 

ironpython雖然能夠互動python,但支援的庫不多,當py檔案依賴三方庫,則會呼叫失敗;且ironpython對python3尚未完全支援,下面就開始在c#在python有第三方庫的情況下互動python。  

把python打包成exe,c#再通過cmd進行互動。就可以解決第三方庫的問題;

修改python檔案(calc.py):依賴了scipy庫

from scip程式設計客棧y import linalg

import numpy as np

import json

def calcnum(jsoninput):

a = np.array([[1, 1, 7], [2, 3, 5], [4, 2, 6]]) # a代表係數矩陣

b = np.array([2, 3, 4]) # b代表常數列

x = linalg.solve(a, b)

# json字串轉物件

info = json.loads(jsoninput)

print(info['a'])

# 物件轉json字串

output = json.dumps(info)

print(output)

print(x)

if __name__ == '__main__':

inputstring = sys.ar**[1]

calcnum(inputstring)

pyinstaller:

pyinstaller 是乙個程式,將(包)python 程式打包到獨立的可執行檔案中,在 windows、linux、mac os x、freebsd、solaris 和 aix 下。與類似工具不同,它的主要優點是 pyinstaller 可以與 python 2.7 和 3.3_3.5 配合使用,它通過透明壓縮構建更小的可執行檔案,它是完全多平台的,並使用作業系統支援來載入動態庫,從而確保完整相容性。

pyinstaller 的主要目標是與開箱即用的第三方軟體包相容。這意味著,使用 pyinstaller 時,所有使外部包正常工作所需的技巧都已整合到 pyinstaller 本身中,因此無需使用者干預。您永遠不需要在 wiki 中查詢技巧,並將自定義修改應用於檔案或設定指令碼。例如,像pyqt、django或matplotlib這樣的庫完全支援,而無需手動處理外掛程式或外部資料檔案。 

安裝:

在cmd命令列中執行:需提前安裝pip(python3.4以後預設包含)

pip install pyinstaller

打包: 

//命令格式

pyinstaller 選項 python 原始檔

選項引數支援以下內容: 

引數描述

-h, -help

檢視幫助文件

-f,-onefile

產生單個的可執行檔案

-d,--onedir

產生乙個目錄(包含多個檔案)作為可執行程式

-a,--ascii

不包含 unicode 字符集支援

-d,--debug

產生 debug 版本的可執行檔案

-w,--windowed,--noconsolc

指定程式執行時不顯示命令列視窗(僅對 windows 有效)

-c,--nowindowed,--console

指定使用命令列視窗執行程式(僅對 windows 有效)

-o dir,--out=dir

指定 spec 檔案的生成目錄。如果沒有指定,則預設使用當前目錄來生成 spec 檔案

-p dir,--path=dir

設定 python 匯入模組的路徑(和設定 pythonpath 環境變數的作用相似)。也可使用路徑分隔符(windows 使用分號,linux 使用冒號)來分隔多個路徑

-n name,--name=name

指定專案(產生的 spec)名字。如果省略該選項,那麼第乙個指令碼的主檔名將作為 spec 的名字

最後在命令列中執行命令:

pyinstaller -f calc.py

打包完成後,生成calc.exe檔案:

呼叫:private string calc(string inputstring)

到此該方法已能成功呼叫python結果 

使用python中flask庫實現乙個簡單的webapi服務:

from flask import flask, request

import math

app = flask(__name__)

@app.route("/")

def welcome():

return "hello world!"

@app.route("/calc")

def calc():

strinput = request.args.get("jsoninput")

return math.calcnum(strinput)

if __name__ == "__main__":

app.run()

最後在c#中呼叫webapi:得到python結果

通過以上內容知道各種語言平台想互動,雖然有多種方式實現;但是最為推薦還是提程式設計客棧供webapi介面方式。

C與Python互動ctype方式記錄

python中封裝了ctype可以用來c與python之間的互動。在vs中選擇動態庫編譯可以將函式編譯成動態庫的形式。下面條件編譯是用來在c 中編譯c的函式,並且匯出成動態庫的。ifdef cplusplus define xext extern c else define xext endif i...

Python與shell的互動方式

考慮這樣乙個問題,有hello.py指令碼,輸出 hello,world 有testinput.py指令碼,等待使用者輸入,然後列印使用者輸入的資料。那麼,怎麼樣把hello.py輸出內容傳送給testinput.py,最後testinput.py列印接收到的 hello,world 下面我來逐步講...

python與cad互動 python與C 互動

python和c 能進行有效的互動,c 呼叫python的一些小用法 寫了乙個python指令碼匯入發生異常,可能是編碼問題 如存在中文 python預設的是ascii 可加上 usr bin python coding utf 8 參見 定義類c資料結構 class point structure...