2017-06-01 28 views
4

私はPython環境を最初に実行するのに役立つC#コードを持っていて、それから私のpythonプロセスを実行します。しかし、問題は実行に多くの時間がかかることです。C#からpythonスクリプトを呼び出す

実際には私は値を渡し、Pythonスクリプトで1行のコードを実行したいだけです。しかし、毎回すべてのPythonコードを実行する必要があります。 Pythonのプロセスを実行する方法がありますし、私が望むときに単一行を実行します。

Iプリント(neigh.predict([VAL1、VAL2、val3は

import numpy as np 
import sys 

val1 = float(sys.argv[1]) 
val2 = float(sys.argv[2]) 
val3 = float(sys.argv[3]) 
val4 = float(sys.argv[4]) 
val5 = float(sys.argv[5]) 
val6 = float(sys.argv[6]) 



# Load dataset 
url = "F:\FINAL YEAR PROJECT\Amila\data2.csv" 
names = ['JawLower', 'BrowLower', 'BrowRaiser', 'LipCornerDepressor', 'LipRaiser','LipStretcher','Emotion_Id'] 
dataset = pandas.read_csv(url, names=names) 

# shape 
# print(dataset.shape) 


# class distribution 
# print(dataset.groupby('Emotion_Id').size()) 


# Split-out validation dataset 
array = dataset.values 
X = array[:,0:6] 
Y = array[:,6] 
neigh = KNeighborsClassifier(n_neighbors=3) 


neigh.fit(X, Y) 

print(neigh.predict([[val1,val2,val3,val4,val5,val6]])) 
スクリプト

この

C#コード

public String Insert(float[] values) 

     { 
      // full path of python interpreter 
      string python = @"C:\ProgramData\Anaconda2\python.exe"; 

      // python app to call 
      string myPythonApp = @"C:\classification.py"; 

      // dummy parameters to send Python script 
      //int x = 2; 
      //int y = 5; 

      // Create new process start info 
      ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(python); 

      // make sure we can read the output from stdout 
      myProcessStartInfo.UseShellExecute = false; 
      myProcessStartInfo.RedirectStandardOutput = true; 
      myProcessStartInfo.CreateNoWindow = true; 
      myProcessStartInfo.WindowStyle = ProcessWindowStyle.Minimized; 

      // start python app with 3 arguments 
      // 1st arguments is pointer to itself, 2nd and 3rd are actual arguments we want to send 
      myProcessStartInfo.Arguments = myPythonApp + " " + values[0] + " " + values[1] + " " + values[2] + " " + values[3] + " " + values[4] + " " + values[5]; 

      Process myProcess = new Process(); 
      // assign start information to the process 
      myProcess.StartInfo = myProcessStartInfo; 


      myProcess.Start(); 

      // Read the standard output of the app we called. 
      // in order to avoid deadlock we will read output first and then wait for process terminate: 
      StreamReader myStreamReader = myProcess.StandardOutput; 
      string myString = myStreamReader.ReadLine(); 

      /*if you need to read multiple lines, you might use: 
       string myString = myStreamReader.ReadToEnd() */ 

      // wait exit signal from the app we called and then close it. 
      myProcess.WaitForExit(); 

      myProcess.Close(); 

      // write the output we got from python app 
      Console.WriteLine("Value received from script: " + myString); 
      Console.WriteLine("Value received from script: " + myString); 

とPythonとC#コードとPythonのプロセスの両方を取り付け、val4、val5、val6]]))これは私が分離して実行したいコードの行です。

+1

http://python4.net – denfromufa

答えて

2

私はあなたがC#アプリケーションからのPythonコードを呼び出すためにREST APIを使用することをお勧めします。を参照してください

を予測する際にはcPickleをして

  1. が関数としてのコードの行を公開し、
  2. は訓練および負荷後にモデルをシリアライズ注釈を付けるフラスコ: は、あなたが2つのライブラリを使用する必要があることを実現するために、:このコードは、私はあなたのようにそれを実行することができますpythonで3.5

    from sklearn import datasets 
    from sklearn.ensemble import RandomForestClassifier 
    import pickle 
    from flask import Flask, abort, jsonify, request 
    import numpy as np 
    import json 
    
    app = Flask(__name__) 
    
    @app.route('/api/create', methods=['GET']) 
    
    def create_model(): 
        iris = datasets.load_iris() 
        x = iris.data 
        y = iris.target 
        model = RandomForestClassifier(n_estimators=100, n_jobs=2) 
        model.fit(x, y) 
        pickle.dump(model, open("iris_model.pkl", "wb")) 
        return "done" 
    
    
    def default(o): 
        if isinstance(o, np.integer): 
         return int(o) 
        raise TypeError 
    
    
    @app.route('/api/predict', methods=['POST']) 
    def make_predict(): 
        my_rfm = pickle.load(open("iris_model.pkl", "rb")) 
        data = request.get_json(force=True) 
        predict_request = [data['sl'], data['sw'], data['pl'], data['pw']] 
        predict_request = np.array(predict_request) 
        output = my_rfm.predict(predict_request)[0] 
        return json.dumps({'result': np.int32(output)}, default=default) 
    
    
    if __name__ == '__main__': 
        app.run(port=8000, debug=True) 
    

    を作成しました210 enter image description here

+0

私はPythonスクリプトをC#プロセスで実行しているので、終了している間に終了します。私が「予測」を実行したいときは、最初から実行する必要があります。ここでも、Pythonスクリプトを生かして、毎回予測する方法は? C#の呼び出し関数も追加してください。理解できたら助けてください。 – Amal

1

C#で埋め込む代わりに実際にPythonを使ってコードを実行してみませんか? Pythonの依存関係を持つ別のマシンにどのようにデプロイするつもりですか?あなたは機械学習モデルを構築したい場合

も同様に私のプロジェクトを試してみてください古典的な機械学習アルゴリズム

ため http://accord-framework.net/のような多くのフレームワークがありますCNTKバックエンドとのdeepakkumar1984/SiaNet( https://github.com/deepakkumar1984/SiaNet)そのC#のラッパー。ラッパーのようなケラを実装しようとしています。それが役に立てば幸い!

関連する問題