brandon Thai Ответов: 1

Как остановить замораживание C# windows forms при попытке динамического веб-скрапа с информацией из файла журнала через Python


Привет,
Я пытаюсь запустить инструмент сводки и классификации файлов журнала python, используя python в качестве базы с графическим интерфейсом windows Forms C#. Мой код таков :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;
using System.Collections;


namespace Sepa

{
    public partial class Form1 : Form
    {
        string LogFileLocation;
        string DataPreprocessScript;
        readonly string SummaryScript;
        readonly string ClassificationScript;
        readonly string PythonFilePath;

        public string DataPreprocessScript1 { get => DataPreprocessScript; set => DataPreprocessScript = value; }

        public Form1()
        {
            PythonFilePath = LocatePython();
            DataPreprocessScript1 = Directory.GetCurrentDirectory() + "\\Scripts\\data_process.py";
            SummaryScript = Directory.GetCurrentDirectory() + "\\Scripts\\Summary_code.py";
            ClassificationScript = Directory.GetCurrentDirectory() + "\\Scripts\\Classify.py";
            InitializeComponent();
        }


        private void BrowseButton_Click(object sender, EventArgs e)

        {
            OpenFileDialog ofd = new OpenFileDialog
            {
                //Only allows user to acess CSV files
                Filter = "CSV Files |* .csv",
                Title = "Open CSV"
            };

            // Check if they opened the file instead of closing the window
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                //temporary outputs filename in a message box
                FilePath.AppendText(ofd.FileName);
                //save csv file location
                LogFileLocation = ofd.FileName;
            }
        }


        private void SubmitButton_Click(object sender, EventArgs e)
        {
            var psi = new ProcessStartInfo
            {
                FileName = PythonFilePath
            };


            //Python Errors and outputs
            var errors = "";


            if (string.IsNullOrEmpty(psi.FileName))
            {
                errors += "Python Not detected on PC";
            }
            //Switch gate for specific python files
            else if(Summary.Checked == false && Classification.Checked == false)
            {
                errors += "Please Pick an Output";
            }
            else if (LogFileLocation == null)
            {
                errors += "No CSV File Submitted";
            }
            else 
            {
                //Python File path
                string script;
                if (Summary.Checked)
                {
                     script = SummaryScript;
                }
                else
                {
                    script = ClassificationScript;
                }
                //Processor Configuration
                psi.Arguments = $"{script} {LogFileLocation} "; 
                psi.UseShellExecute = false;
                psi.CreateNoWindow = true;
                psi.RedirectStandardOutput = true;
                psi.RedirectStandardError = true;

                    //Running Python Script
                    RunPython(psi, errors);

                
            }


            

        }



        private void Form1_Load(object sender, EventArgs e)
        {

        }


        private void Clear_Click(object sender, EventArgs e)

        {
            Output.Text = "";
        }

        private void RunPython(ProcessStartInfo psi, string errors)
        {
            var results = "";
            using (var process = Process.Start(psi))
            {

                errors += process.StandardError.ReadToEnd();
                results += process.StandardOutput.ReadToEnd();

            }
            //Output To Terminal
            if (!string.IsNullOrEmpty(results))
            {
                Output.Text += "Results: " + results + System.Environment.NewLine;
            }

            if (!string.IsNullOrEmpty(errors))
            {
                Output.Text += "Errors: " + errors + System.Environment.NewLine;
            }
        }

        private string LocatePython()
        {
            //Outpuits entire value of envirmoental variables into 1 string
            string Path = Environment.GetEnvironmentVariable("Path");
            //splits the enviromental variables into individuals paths
            string[] paths = Path.Split(';');
            //Cycle through enviromental variables till it finds python
            for (int i = 0; i < paths.Length; i++)
            {
                string p = paths[i];
                if (p.IndexOf("Python") > -1)
                {
                    return p;
                }
                continue;
            }
            return "";

        }
    }
    
}



А на языке Python:
#!/usr/bin/env python
# coding: utf-8

# In[59]:


#Import Python Libraries
import pandas as pd
import numpy as np
import re
import os
import wikipedia as wk
import wikipediaapi
import sys

import requests
from bs4 import BeautifulSoup


# In[63]:


#Read csv file - change it to add code for insertion of input "C:/Users/harsh/OneDrive/Desktop/CMD_Sample.csv"
try:
    filename = sys.argv[1]
    df = pd.read_csv(filename)
except IOError:
    print("Error: File cannot be found/ Data cannot be read")
    sys.exit()
else:
    print("Successful upload of file.")

# getting access to file path for output purposes
savefile = filename.rsplit('.')
savefilepath = savefile[0]


# In[86]:


#deleting columns that are not required
try: #incase there is no time column
        df = df[['Time of Day','Process Name','PID','Command Line']]
except KeyError:
        df = df[['Process Name','PID','Command Line']]

#data preprocessing - in case of missing values
df.fillna('N/A', inplace = True)
df.fillna(0, inplace = True)

#separate cmd line columns from the other columns
try: #incase of absence of time column
    df1 = df[['Time of Day','Process Name','PID','Command Line']]
except KeyError:
    df1 = df[['Process Name','PID','Command Line']]

#separating command line column for translation work
df2 = df[['Command Line']]

#removing space in column names
df1 = df1.rename({'Command Line': 'Command_Line'}, axis='columns')
df2 = df2.rename({'Command Line': 'Command_Line'}, axis='columns')
print("Data preprocessing is complete.")


# In[87]:


#separating cmd line column into two - Command Line and Command Path
df2[['Command_Path','Command_Line']] = df2.Command_Line.str.split(" ",n=1,expand=True)


# In[88]:


#creating dictionary for special characters
charreplace = {
  "\\\\": " ",
    "\"": " ",
    "\'": " "
}
#replacing special characters in command line args
df_fixed = df2.replace({'Command_Line':charreplace, 'Command_Path':charreplace}, regex=True)

df2[['Command_Path']] = df_fixed[['Command_Path']]
df2[['Command_Line']] = df_fixed[['Command_Line']]

#remove extra dataframes
del df_fixed


# In[89]:


#separating main file for translation
df2[['path','file']] = df2.Command_Path.str.rsplit(" ",n=1,expand=True)
# defining list for translation result
translation = []
#use df2["file"] as the resulting column
cleanr = re.compile('<.*?>')

executable = list(df2["file"])
for index in executable:
	if index is not None:
		a = re.sub('.exe' ,'.html', index.lower())
		#url = "https://ss64.com/nt/eventcreate.html"
		url = "https://ss64.com/nt/" + a
		response = requests.get(url)
		if url == "https://ss64.com/nt/":
			title = "[Page not found]"
		else:
			soup = BeautifulSoup(response.text, "html.parser")
			title = re.sub(cleanr, '', str(soup.findAll('title')))

		if title != "[Page not found]":
			htmlcontent = soup.findAll('p')
			y = False
			for x in htmlcontent:
				if y is False:
					print(re.sub(cleanr,'',str(x)))
					y = True
		else:
			print("Manual Not Found")
# In[ ]:


Я использую Индекс A-Z команд Windows CMD - SS64.com[^] ручная страница, чтобы получить мою информацию через веб-выскабливание, но графический интерфейс, похоже, не может справиться с динамическим поиском, создавая правильный URL-адрес, добавляя файл .exe на заднюю панель и просто бесконечно зависает. В настоящее время программа печатает его на терминале, но в конечном итоге он будет сохранен в документе excel. При обычном запуске этого кода через python он выводит все совершенно нормально, но просто зависает от моего графического интерфейса. Я даже не знаю, с чего начать поиски проблем.

Что я уже пробовал:

Я пробовал вручную устанавливать URL-адрес на определенные страницы и получать информацию, и эта информация правильно выводится, но замерзнет, когда графический интерфейс попытается создать URL-адрес через файл журнала, даже если созданный URL-адрес должен быть таким же, как введенный вручную.

1 Ответов

Рейтинг:
1

CPallini

Вы можете выполнить свою трудоемкую задачу (RunPython) в BackgroundWorker нить. Видеть Класс BackgroundWorker (System.ComponentModel) | Microsoft Docs[^].


TheRealSteveJudge

5*

brandon Thai

После тестирования все, что он действительно делает, это делает его таким, чтобы я все еще мог взаимодействовать с графическим интерфейсом, пока программа работает, но он все еще не выводит то, что должен, что все еще не лучше, чем быть замороженным