Выполнение скрипта Python в приложении службы Windows (пользователь не вошел в систему) - PullRequest
0 голосов
/ 02 октября 2019

Запуск сценария Python (разработанного в другом отделе) приложением-службой Windows C #.

Я написал консольное приложение, которое выполняет сценарий Python. Теперь я попытался преобразовать консольное приложение в службу Windows. Служба Windows работает без посредника сценариев (вход в журнал событий). Служба остановлена ​​в точке запуска ProcessStartInfo.

public string Run()
        {
            _pySkript.WorkingDirectory = _workinDirectory;
            _pySkript.FileName = _pythonPath;
            _pySkript.Arguments = string.Format("{0} {1} {2} {3} {4} {5} {6}", a, b, c, d, e, f, g);
            _pySkript.UseShellExecute = false;
            _pySkript.RedirectStandardOutput = true;
            _pySkript.CreateNoWindow = true;
            _pySkript.RedirectStandardError = true;
            _pySkript.RedirectStandardInput = true;
            _pySkript.ErrorDialog = false;
            _pySkript.WindowStyle = ProcessWindowStyle.Hidden;

            using (Process process = Process.Start(_pySkript))
            {
                using (StreamReader reader = process.StandardOutput)
                {
                    string result = reader.ReadToEnd();
                    OnScriptRunFinished();
                    return result;
                }
            }
        }

1 Ответ

0 голосов
/ 07 октября 2019

Спасибо @BugFinder за его поддержку. В конце это была орфографическая ошибка.

Пример решения:

Первый проект: Logic.csproj

using System;
using System.Diagnostics;
using System.IO;

namespace Logic
{
public class RunScript
{
    string _parameterString = string.Format("{0} {1} {2} {3}","main.py", "Testuser", "TestPw", "MyEnviroment");
    string _resultCon;
    public string Start()
    {
        ProcessStartInfo _pySkript = new ProcessStartInfo();

        _pySkript.WorkingDirectory = @"D:\GitRepos\ScriptRunner\PyScript\";
        _pySkript.FileName = "python";
        _pySkript.Arguments = _parameterString;
        _pySkript.UseShellExecute = false;
        _pySkript.RedirectStandardOutput = true;
        _pySkript.CreateNoWindow = true;
        _pySkript.RedirectStandardError = true;
        _pySkript.RedirectStandardInput = true;
        _pySkript.ErrorDialog = false;
        _pySkript.WindowStyle = ProcessWindowStyle.Hidden;

        try
        {
            using (Process process = Process.Start(_pySkript))
            {
                using (StreamReader reader = process.StandardOutput)
                {
                    _resultCon = reader.ReadToEnd();
                }
            }
        }
        catch (Exception ex)
        {
            _resultCon = ex.ToString();
        }
        return _resultCon;
    }
  }
}

Второй проект: ScriptRunner.csproj

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Logic;

namespace ScriptRunner
{
class Program
{
    static void Main(string[] args)
    {
        var runMyScript = new RunScript();
        Console.WriteLine(runMyScript.Start());
    }
  }
}

Третий проект: ScriptRunnerService.csproj

using System.Diagnostics;
using System.ServiceProcess;
using Logic;

namespace ScriptRunnerService
{
public partial class ScriptRunService : ServiceBase
{
    public ScriptRunService()
    {
        InitializeComponent();
        eventLog1 = new EventLog();
        if (!EventLog.SourceExists("MySource"))
        {
            EventLog.CreateEventSource(
                "MySource", "MyNewLog");
        }
        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";

        var runMyScript = new RunScript();
        var output = runMyScript.Start();
        eventLog1.WriteEntry(output.ToString(), EventLogEntryType.Information);
    }

    protected override void OnStart(string[] args)
    {
        eventLog1.WriteEntry("In OnStart.", EventLogEntryType.Information);
    }

    protected override void OnStop()
    {
        eventLog1.WriteEntry("In OnStop.", EventLogEntryType.Information);
    }
  }
}

Служба установки:

Вам необходим InstallUtil.exe для установки службы!

installutil -i ScriptRunnerService.exe

Ключ Windows: r services.msc -> Запуск службы eventvwr.msc -> Журналы проверок

Служба удаления:

installutil -u ScriptRunnerService.exe

Поиск готового решения вкл. скрипт на GitHub

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...