Python Скрипт запускается из C# оставляет Python exe, работающий в фоновом режиме, поглощающий память - PullRequest
0 голосов
/ 29 мая 2020

Я разрабатываю C# ASP. Net Сервис, который постоянно читает GPIO на raspberry pis. Это считывает контакты для входов, а также запускает контакты для выходов. У меня работает вызов, но моя проблема в том, что я вызываю сценарии Python каждые 0,5 секунды, когда это необходимо. например, вход для чтения будет вызываться каждые 0,5 секунды, но выходы будут срабатывать только при необходимости. Моя проблема в том, что каждый вызов запускает новый экземпляр Python .exe и не закрывает их при запуске скрипта. Я пробовал все виды выходов из сценария python, а также некоторые из C#, например. process.Kill (), но ничего не убивает Python exe. Прилагается изображение диспетчера задач, чтобы показать проблему. Ниже я добавлю код, который использую для вызова сценария python, и сценарий чтения ввода, чтобы показать вызываемый мной сценарий python. Я оставил несколько комментариев, чтобы вы могли увидеть, что я пробовал ранее. Спасибо

enter image description here

Код для вызова Python Скрипт:

String exePath = SystemSettingDB.GetSettingValue("Python Executbale Path");
string holdPath = SystemSettingDB.GetSettingValue("Door Open Script Path");

var open = new ProcessStartInfo();

open.FileName = exePath;

var controllerIP = _controllerIP;

open.Arguments = $"\"{holdPath}\" \"{controllerIP}\" \"{_pin}\"";


open.UseShellExecute = false;
open.CreateNoWindow = true;
open.RedirectStandardOutput = true;
open.RedirectStandardError = true;

var process = Process.Start(open);


if (process != null)
{
     process.Kill();
     return true;
}

Python Скрипт для чтения входных данных

import sys

import os
from time import sleep

os.environ["PIGPIO_PORT"] = "8888"
os.environ["GPIOZERO_PIN_FACTORY"] = "pigpio"
from gpiozero import LED

os.environ["PIGPIO_ADDR"] = sys.argv[1]
gpio_pin = sys.argv[2] 

door = LED(gpio_pin)

door._read()
print(door.value)

sys.exit(0)
#os._exit(-1)

1 Ответ

0 голосов
/ 29 мая 2020

Попробуйте следующее: 1. Загрузите PSTools из: https://docs.microsoft.com/en-us/sysinternals/downloads/pskill 2. Напишите следующий код:

>       public static void killPython()
    {
        var killPython = new ProcessStartInfo();
        killPython.FileName = @"\Your_PSTools_Path\pskill.exe";
        //-t Kill the process and its descendants. 
        killPython.Arguments = "-t PID"; //process PID from Task Manager
        Process.Start(killPython);
    }
Запустите свой код от имени администратора
...