gpt4 book ai didi

c# - 从 C# 调用 python 脚本

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:17 27 4
gpt4 key购买 nike

我有一个 C# 代码,它有助于首先运行 python 环境,然后它执行我的 python 进程。但问题是执行起来需要很多时间。

实际上我只想传递我的值并在 python 脚本中执行单行代码。但是每次都需要执行所有的python代码。有没有办法在外面运行 python 进程,并在我需要时只运行单行。

我附上了 C# 代码和 python 进程

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脚本

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]])) 这是我想单独执行的代码行。

最佳答案

我建议您使用 REST API 从 C# 应用程序调用 python 代码。为此,您需要使用两个库:CPickle 和 flask

  1. 将代码行公开为一个函数并进行注释
  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)

你可以运行它: enter image description here

关于c# - 从 C# 调用 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44306109/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com