C 呼叫 py檔案並在控制項上顯示結果的方法(一)

2021-10-02 04:35:56 字數 3500 閱讀 6230

受到師兄們和甲方的雙重**(開個玩笑),非要把深度學習模型加到現在的軟體上去,雖然感覺這是乙個必然事件,心裡還是mmp(剛上研一的機械小萌新真的什麼都不會啊qaq)。不過任務分配了還是要全力以赴的,然後就是不停的找資料找方法,找來找去都是那幾個相同的c#**,相同的python**(ok,那肯定能行吧)。。。。。

下面附上參考的資料,

import numpy as np

import sys

deffunc

(a,b)

: result=np.sqrt(

int(a)

*int

(b))

return result

if __name__ ==

'__main__'

:print

(func(sys.ar**[1]

,sys.ar**[2]

))

然後用anaconda prompt 先執行一下:

ok能執行,那後面就是希望能在textbox上輸出這個數值。

這部分也前輩們寫的其實都是差不多的,也就是主題的部分是一樣的,但是由於他們的結果只能夠在輸出欄中看到,而我是想要在控制項上顯示,所以做了一點點修改。

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.windows.forms;

using system.diagnostics;

//process程序類

using system.threading.tasks;

using system.windows;

namespace python_inte***ce

private

void

btn1_click

(object sender,

eventargs e)

public

void

runpython

(string sargname,

params

string

teps)

p.startinfo.arguments = sarguments;

//設定啟動的python需要的命令語句

p.startinfo.useshellexecute =

false

; p.startinfo.redirectstandardoutput =

true

; p.startinfo.redirectstandardinput =

true

; p.startinfo.redirectstandarderror =

true

; p.startinfo.createnowindow =

true

; p.

start()

; p.

beginoutputreadline()

;//在應用程式的重定向 standardoutput 流上開始進行非同步讀取操作。

p.outputdatareceived +

=new

datareceivedeventhandler

(p_outputdatareceived)

;

console.

readline()

; p.

waitforexit()

;}private

void

p_outputdatareceived

(object sender,

datareceivedeventargs e)

//這裡將方法給出了,然後也就在這裡執行

}private

void

form1_load

(object sender,

eventargs e)

}}

執行後效果就是這樣啦!

1、由於對程序類了解不多(剛開始學c#幾個月的小菜鳥),剛開始讀**都困難尤其是這一句,

p.outputdatareceived +

=new

datareceivedeventhandler

(p_outputdatareceived)

;

設定斷點一句句執行,發現系統在這句沒有直接跳到下面的方法中,而是從上到下執行;

後來意識到,這裡只是指定了這一種方法,只有到這個方法出現了,才去執行。

ps。如果我理解錯了,煩請大神多多指教啦

2、一開始除錯的過程中發現不管怎麼做,結果都顯示不到textbox上面(這裡首先排除了使用全域性變數的方法,因為考慮到後期需要處理的不是乙個簡單變數)。後來發現原來前輩們在宣告runpython函式的時候,把他宣告為靜態的了,以至於後面其他方法也都是靜態的。。。。。

public

static

void

runpythonscript

(string sargname,

string args ="",

params

string

teps)

static

void

p_outputdatareceived

(object sender,

datareceivedeventargs e)

public

static

void

(string text)

所以如果在等到處理python.exe中傳過來的資料的時候怎麼放不放到控制項上。

統統改掉傳值問題就能得到解決了!

3、注意多執行緒問題:解決完上面的問題,發現還是不行。。。。。

private

void

form1_load

(object sender,

eventargs e)

來看一下官方的解釋:獲取或設定乙個值,該值指示是否捕獲對錯誤執行緒的呼叫,這些呼叫在除錯應用程式時訪問控制項的 handle 屬性。

嗯。。看不懂。大概就是讓不同執行緒之間能傳值的意思吧。

基於C 呼叫OCX控制項的常用方法 推薦

小夥伴們在使用icp提供的各種能力進行整合開發時常常會遇到一些技術上的困擾,例如icp中很多介面是通過ocx控制項的方式提供的,如何呼叫這些介面,就成了乙個不大不小的問題,畢竟開發指南上可沒這些內容啊 別著急,今天我就給大家介紹一下c 中呼叫ocx介面的常用方法。y 開發環境 win7企業版,vs2...

C 反射動態呼叫dll中的方法,並返回結果

最近在看工廠開發模式,發現用到了反射,之前只聽說過也沒怎麼用過 所以花了點時間重新溫習了一遍 反射的作用是動態的載入某個dll 程式集 並執行該程式集中的某個方法,並返回結果 當然也可以給該方法傳遞引數 直接上 namespace assembly name 上邊寫乙個測試類,命名空間是assemb...

C 反射動態呼叫dll中的方法,並返回結果

最近在看工廠開發模式,發現用到了反射,之前只聽說過也沒怎麼用過 所以花了點時間重新溫習了一遍 反射的作用是動態的載入某個dll 程式集 並執行該程式集中的某個方法,並返回結果 當然也可以給該方法傳遞引數 namespace assembly name 上邊寫乙個測試類,命名空間是assembly n...