2017-06-01 10 views
4

Ich habe einen C# -Code, der hilft, Python-Umgebung zuerst auszuführen, und dann führt es meinen Python-Prozess aus. Das Problem ist jedoch, dass die Ausführung viel Zeit in Anspruch nimmt.Aufruf von Python-Skript von C#

Eigentlich möchte ich nur meine Werte weitergeben und einzelne Codezeile in Python-Skript ausführen. Aber müssen alle Python-Code jedes Mal ausführen. Gibt es eine Möglichkeit, Python-Prozess außerhalb der Seite auszuführen und nur die einzelne Zeile auszuführen, wenn ich möchte.

angebracht ich sowohl C# -Code und Python-Prozess mit diesem

C# -Code

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); 

und Python Script

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]])) 

print (neigh.predict ([[val1, val2, val3 , val4, val5, val6]])) dies ist die Codezeile, die ich getrennt ausführen möchte.

+1

http://python4.net – denfromufa

Antwort

2

Ich würde vorschlagen, Sie REST-API verwenden Python-Code von C# .NET-Anwendung aufzurufen. Um das zu erreichen, dass Sie zwei Bibliotheken verwenden müssen: cPickle und

  1. Expose Codezeile als Funktion Flasche und mit Anmerkungen versehen
  2. Ihr Modell nach dem Training und Last serialise wenn

der Vorhersage verweist auf dieser Code, ich habe in 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) 

erstellt Sie es ausführen können wie: enter image description here

+0

Da ich das Python-Skript durch einen C# -Prozess ausführen, schließt es, während es endet. Wenn ich "vorhersagen" möchte, muss ich es von Anfang an ausführen. Auch hier, wie man das Python-Skript am Leben hält und jedes Mal vorhersagen kann? Wenn Sie bitte auch die C# -Aufruffunktion hinzufügen könnten, wäre es hilfreich zu verstehen – Amal

1

Warum verwenden Sie Python nicht eigentlich, um den Code auszuführen anstatt in C# einzubetten? Wie werden Sie auf einem anderen Computer mit Python-Abhängigkeiten bereitstellen?

Wenn Sie möchten, maschinelles Lernen Modelle bauen gibt es viele Frameworks wie http://accord-framework.net/ für klassische Algorithmen für maschinelles Lernen

Auch als auch mein Projekt versuchen: deepakkumar1984/Sianet (https://github.com/deepakkumar1984/SiaNet) Es ist ein C# Wrapper mit CNTK Backend. Versuchen Keras wie Wrapper zu implementieren. Ich hoffe es hilft!