Я пытаюсь запустить некоторый код Python в моем скрипте C#, который называется «бот cAl go», используя API, который взаимодействует с программой под названием «cTrader». Тем не менее, я не думаю, что эта часть технически относится к моей проблеме. Я использую код Python, используя программу запуска C # Python (код ниже). Для этого я использую командную строку и даю аргументы с пробелами, разделяющими аргументы.
Когда я запускаю test_python_script1.py
, вывод успешных результатов печатается в журнале cTrader, и я получаю доступ к этим данным в C#. Однако, когда я запускаю test_python_script2.py
, вывод не приходит. Единственная разница между этими файлами состоит в том, что второй запускает строку model = torch.load("saved_model_1")
. Я пытался подавить вывод консоли во время этого вызова линии, но безуспешно.
Кто-нибудь знает, как я могу запустить эту строку и получить вывод в мой бот cAl go?
Кроме просто заставить текущий код работать, есть три возможных решения:
- Экспортируйте модель PyTorch как модель ONNX, затем импортируйте модель ONNX в C# для вывода
- Использование TorchSharp для импорта модели PyTorch в C# напрямую
- Попробуйте другой метод интерпретации Python в C#, который называется "Python for. NET"
Python script ("test_python_script1.py") - (работает)
import sys import torch
# model = torch.load("saved_model_1")
def add_numbers(x,y): sum = x + y return sum
num1 = float(sys.argv[1]) num2 = float(sys.argv[2])
print(add_numbers(num1, num2))
Python script ("test_python_script2.py") - (не работает)
import sys
import torch
model = torch.load("saved_model_1")
def add_numbers(x,y):
sum = x + y
return sum
num1 = float(sys.argv[1])
num2 = float(sys.argv[2])
print(add_numbers(num1, num2))
C# скрипт
using System;
using System.Linq;
using System.IO;
using System.Collections.Generic;
using System.Diagnostics;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
public class TomTest : Robot
{
// Windows username
[Parameter(DefaultValue = "Tom")]
public string WindowsUsername { get; set; }
// Python script runner
// args separated by spaces
public static string RunFromCmd(string rWindowsUsername, string rCodeFilePath, string args)
{
string result = string.Empty;
try
{
var info = new ProcessStartInfo("C:\\Users\\" + rWindowsUsername + "\\anaconda3\\python.exe")
{
Arguments = rCodeFilePath + " " + args,
RedirectStandardInput = false,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (var proc = new Process())
{
proc.StartInfo = info;
proc.Start();
proc.WaitForExit();
if (proc.ExitCode == 0)
{
result = proc.StandardOutput.ReadToEnd();
}
}
return result;
}
catch (Exception ex)
{
throw new Exception("Python script failed: " + result, ex);
}
}
protected override void OnStart()
{
string test_python_script = TomTest.RunFromCmd(WindowsUsername, "C:\\Users\\" + WindowsUsername + "\\Desktop\\test_python_script.py", "0.5 0.5");
Print("test script output: " + test_python_script);
}
protected override void OnTick()
{
// do nothing
}
protected override void OnStop()
{
// do nothing
}
}
}