溫馨提示×

溫馨提示×

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

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

C#調(diào)用python程序的解決方案

發(fā)布時間:2020-05-11 06:08:48 來源:網(wǎng)絡(luò) 閱讀:2714 作者:nineteens 欄目:編程語言

  一、前言

  最近涉及到復(fù)雜網(wǎng)絡(luò)的建模和可視化輸出,程序是用C#寫的,網(wǎng)絡(luò)分析打算使用igraph-python。

  自然不可避免地就考慮如何使用C#調(diào)用python程序:

  二、嘗試過的方法

  1. 嘗試使用.NET上的Python工具:IronPython —> 失敗

  IronPython是一種在.NET和Mono上實(shí)現(xiàn)的Python語言,使用InronPython就可以在.NET環(huán)境中調(diào)用Python代碼。

  具體地,需要在當(dāng)前解決方案的nuget管理包中,下載ironPython安裝包

  IronPython自帶一套python的核心類,但是不包含第三方類,嘗試過將類從外部拷貝進(jìn)去,或在python文件中采用import等方式指定會用到的第三方類的地址等,均失敗。

  (1)調(diào)用igraph-python第三方庫中的方法,總是報錯:ImportError: No module named xxx(例如:ImportError: No module named pexpect)

  出錯原因可能是:①模塊未安裝;②模塊安裝了,但是沒有安裝到python的搜索路徑中

  嘗試了多種方式,①在python源碼中,使用import通過指定路徑的方式導(dǎo)入第三方庫;②配置Path環(huán)境變量,把第三方庫直接寫進(jìn)環(huán)境變量等。

  最后依然失敗了,以下是我覺得可行但嘗試過后失敗的方法:

  甚至參考博客后,考慮過是不是安裝的方式不同,類庫的使用也會造成問題,而不用pip改用easy install來安裝了一遍igraph-python:

  各位不妨自行嘗試一下,因?yàn)槲也怀晒Σ灰欢ㄒ馕吨椒ㄓ袉栴},可能是我的配置和操作存在問題

  (2)嘗試將python打包成exe可執(zhí)行文件,然后在C#中開辟進(jìn)程調(diào)用執(zhí)行exe文件 —> 失敗

  (3)在C#中開辟一個進(jìn)程,調(diào)用執(zhí)行.bat批處理文件,在批處理文件中,執(zhí)行python程序(當(dāng)然,使用的是本地的python環(huán)境) —> 成功

  最后無奈之下,嘗試曲線救國,在C#中開辟進(jìn)程,執(zhí)行批處理文件,在批處理文件中,通過shell命令執(zhí)行python程序。方法不夠優(yōu)雅(而且執(zhí)行批處理文件會彈出黑窗口命令行,一閃而過),但終歸是實(shí)現(xiàn)了功能。

  C#創(chuàng)建進(jìn)程代碼如下:

  【下列代碼是在一個Windows窗體應(yīng)用(.NET Framework)中,窗體類的一個按鈕單擊事件btn_Click()中的】

  【所以各位不妨自己新建一個窗體應(yīng)用并添加一個Button按鈕,并為其綁定click事件,進(jìn)行測試】

  //C#代碼

  /*

  * 創(chuàng)建一個進(jìn)程,調(diào)用.bat批處理文件,來執(zhí)行python源文件

  * 【注意,python源文件中不能有中文字符(注釋也不能有,否則報錯)】

  */

  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代碼,我使用的#來注釋】

  start python result.py #rem 100 100 #傳參問題尚未解決解決

  #執(zhí)行完畢后不立即關(guān)閉命令行執(zhí)行框

  #rem pause

  python文件如下:

  # -*- coding:UTF8 -*-

  #import sys #導(dǎo)入sys module;

  #sys.path.append("D:\\SfotWare\\Python\\Python27\\Lib\\") #增加搜索路徑,也就是說當(dāng)import某個module的時候,將會到已有的搜索路徑中查找;

  #import igraph #導(dǎo)入CPython中名為random的module;

  #---------------------------------------------------------------------

  #import sys無錫好的×××醫(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

  #---------------------------------------------------------------------

  #上述注釋掉的方式,就是通過在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)的個數(shù)

  但如何給批處理文件傳參,尚未解決。

  三、結(jié)束語

  參考了很多博主的內(nèi)容,嘗試了很多方法,今后還需再接再厲。

  上述方式中,我嘗試過但是失敗了的,各位如果成功了,或者是各位有什么新的解決方式,如果愿意跟我分享一下,我將非常感謝。希望我們共同學(xué)習(xí),共同進(jìn)步。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI