一、前言
公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出原陽(yáng)免費(fèi)做網(wǎng)站回饋大家。
最近涉及到復(fù)雜網(wǎng)絡(luò)的建模和可視化輸出,程序是用C#寫的,網(wǎng)絡(luò)分析打算使用igraph-python。
自然不可避免地就考慮如何使用C#調(diào)用python程序:
二、嘗試過(guò)的方法
1. 嘗試使用.NET上的Python工具:IronPython —> 失敗
IronPython是一種在.NET和Mono上實(shí)現(xiàn)的Python語(yǔ)言,使用InronPython就可以在.NET環(huán)境中調(diào)用Python代碼。
具體地,需要在當(dāng)前解決方案的nuget管理包中,下載ironPython安裝包
IronPython自帶一套python的核心類,但是不包含第三方類,嘗試過(guò)將類從外部拷貝進(jìn)去,或在python文件中采用import等方式指定會(huì)用到的第三方類的地址等,均失敗。
(1)調(diào)用igraph-python第三方庫(kù)中的方法,總是報(bào)錯(cuò):ImportError: No module named xxx(例如:ImportError: No module named pexpect)
出錯(cuò)原因可能是:①模塊未安裝;②模塊安裝了,但是沒(méi)有安裝到python的搜索路徑中
嘗試了多種方式,①在python源碼中,使用import通過(guò)指定路徑的方式導(dǎo)入第三方庫(kù);②配置Path環(huán)境變量,把第三方庫(kù)直接寫進(jìn)環(huán)境變量等。
最后依然失敗了,以下是我覺(jué)得可行但嘗試過(guò)后失敗的方法:
甚至參考博客后,考慮過(guò)是不是安裝的方式不同,類庫(kù)的使用也會(huì)造成問(wèn)題,而不用pip改用easy install來(lái)安裝了一遍igraph-python:
各位不妨自行嘗試一下,因?yàn)槲也怀晒Σ灰欢ㄒ馕吨椒ㄓ袉?wèn)題,可能是我的配置和操作存在問(wèn)題
(2)嘗試將python打包成exe可執(zhí)行文件,然后在C#中開辟進(jìn)程調(diào)用執(zhí)行exe文件 —> 失敗
(3)在C#中開辟一個(gè)進(jìn)程,調(diào)用執(zhí)行.bat批處理文件,在批處理文件中,執(zhí)行python程序(當(dāng)然,使用的是本地的python環(huán)境) —> 成功
最后無(wú)奈之下,嘗試曲線救國(guó),在C#中開辟進(jìn)程,執(zhí)行批處理文件,在批處理文件中,通過(guò)shell命令執(zhí)行python程序。方法不夠優(yōu)雅(而且執(zhí)行批處理文件會(huì)彈出黑窗口命令行,一閃而過(guò)),但終歸是實(shí)現(xiàn)了功能。
C#創(chuàng)建進(jìn)程代碼如下:
【下列代碼是在一個(gè)Windows窗體應(yīng)用(.NET Framework)中,窗體類的一個(gè)按鈕單擊事件btn_Click()中的】
【所以各位不妨自己新建一個(gè)窗體應(yīng)用并添加一個(gè)Button按鈕,并為其綁定click事件,進(jìn)行測(cè)試】
//C#代碼
/*
* 創(chuàng)建一個(gè)進(jìn)程,調(diào)用.bat批處理文件,來(lái)執(zhí)行python源文件
* 【注意,python源文件中不能有中文字符(注釋也不能有,否則報(bào)錯(cuò))】
*/
Process proc = null;
try
{
string targetDir = string.Format(dataPath);
proc = new Process();
proc.StartInfo.WorkingDirectory = targetDir;
proc.StartInfo.FileName = "myPython.bat";
//proc.StartInfo.Arguments = string.Format("100");//this is argument
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//這里設(shè)置DOS窗口不顯示,經(jīng)實(shí)踐可行
proc.Start();
proc.WaitForExit();
proc.Close();
}
catch (Exception ex)
{
MessageBox.Show("Exception Occurred : " + ex.Message + ", " + ex.StackTrace.ToString());
}
批處理文件內(nèi)容如下:
【注意:.bat文件中,注釋格式使用rem,這里由于只支持shell代碼,我使用的#來(lái)注釋】
start python result.py #rem 100 100 #傳參問(wèn)題尚未解決解決
#執(zhí)行完畢后不立即關(guān)閉命令行執(zhí)行框
#rem pause
python文件如下:
# -*- coding:UTF8 -*-
#import sys #導(dǎo)入sys module;
#sys.path.append("D:\\SfotWare\\Python\\Python27\\Lib\\") #增加搜索路徑,也就是說(shuō)當(dāng)import某個(gè)module的時(shí)候,將會(huì)到已有的搜索路徑中查找;
#import igraph #導(dǎo)入CPython中名為random的module;
#---------------------------------------------------------------------
#import sys無(wú)錫好的×××醫(yī)院 http://www.zzchnk.com/
#sys.path.append(r'D:\SfotWare\Python\Python27')
#sys.path.append(r'D:\SfotWare\Python\Python27\Lib\DLLs')
#sys.path.append(r"D:\SfotWare\Python\Python27\Lib")
#sys.path.append(r"D:\SfotWare\Python\Python27\Lib\site-packages")
#sys.path.append(r'D:\SfotWare\Python\Python27\Lib\site-packages\python_igraph-0.7.1.post6-py2.7-win-amd64.egg')
#sys.path.append(r'D:\SfotWare\Python\Python27\Lib\site-packages\pycairo-1.18.0-py2.7-win-amd64.egg')
#import igraph
#---------------------------------------------------------------------
#上述注釋掉的方式,就是通過(guò)在python源文件中導(dǎo)入第三方module,未能生效
from igraph import *
edges = []
# 從文件@filename中讀入網(wǎng)絡(luò)的邊
def read_edges(filename):
fin = open(filename, "r")
for line in fin:
line = line.strip()
line = line.split(" ")
edges.append((int(line[0]) - 1, int(line[1]) - 1))
def plot_network(size):
g = Graph()
g.add_vertices(size)
g.add_edges(edges)
layout = g.layout('kk')
visual_style = {}
visual_style['layout'] = layout
visual_style['bbox'] = (500,500)
visual_style['vertex_label'] = [(label + 1) for label in range(size)]
visual_style['vertex_color'] = 'white' # 顏色
visual_style['vertex_size'] = g.degree() # 節(jié)點(diǎn)的大小與度成正比
# visual_style['vertex_size'] = 20 # 所有節(jié)點(diǎn)的大小都是相同的:20
plot(g, r"D:\Project\vs2017_project\test_csProject1\test_csProject1\bin\Debug\network_smallworld.png", **visual_style)
# 中間參數(shù)指的是存到哪里去
def main(size):
read_edges(r"D:\Project\vs2017_project\test_csProject1\test_csProject1\bin\Debug\smallworld_edges.data")
plot_network(size)
main(100) # 這里的10需要更改為網(wǎng)絡(luò)中的節(jié)點(diǎn)的個(gè)數(shù)
但如何給批處理文件傳參,尚未解決。
三、結(jié)束語(yǔ)
參考了很多博主的內(nèi)容,嘗試了很多方法,今后還需再接再厲。
上述方式中,我嘗試過(guò)但是失敗了的,各位如果成功了,或者是各位有什么新的解決方式,如果愿意跟我分享一下,我將非常感謝。希望我們共同學(xué)習(xí),共同進(jìn)步。
網(wǎng)頁(yè)題目:C#調(diào)用python程序的解決方案
標(biāo)題路徑:http://vcdvsql.cn/article2/gjshic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站收錄、域名注冊(cè)、全網(wǎng)營(yíng)銷推廣、移動(dòng)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)