Member 14367686 Ответов: 2

В linux у меня есть некоторые проблемы с обработкой Python на monodevelop C#


hi. i have some problem when i process python on monodevelop C#.
at first , my program is launching on C# ( ubuntu Monodevelop )

and i want to process some python program ( by using bash )

it was done. i`ve succeed to process my python program by using 'Process' class

but when i get result of Program line by line, there was some problem
my python program give result line maybe once per a sec.
but when i try 'ReadLine', it didn`t give me result once per a sec.
it seems 60 line per 60sec. ( Read 60 Lines at once )

i need result everyseconds.
whats wrong on my code or how can i get result every seconds?


<pre>using System;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;
public class monostart:Form
{
    public static void Main()
    {
        Application.Run(new monostart());
    }

    public monostart()
    {
        this.ClientSize = new Size(960, 540);
        BaseBoard(this);
    }
    public void BaseBoard(Form baseboard)
    {
        Button testgButton = new Button();
        testgButton.Click += TestgButton_Click;
        testgButton.Height = 30;
        testgButton.Width = 30;
        testgButton.Location = new Point(300, 300);
        testgButton.Parent = Base;
      


    }

    void TestgButton_Click(object sender, EventArgs e)
    {
        Process proc = new Process();

     
        proc.StartInfo.FileName = "/bin/bash";
        proc.StartInfo.Arguments = "-c \"cd body25_2 && bash run_softmax.sh\"";
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.CreateNoWindow = false;
        proc.OutputDataReceived += new DataReceivedEventHandler(receive);
        proc.Start();

        proc.BeginOutputReadLine();
        proc.WaitForExit();
   
        //   while(!proc.StandardOutput.EndOfStream)
        //   {
        //       string temp = "text : ";
        //       temp += proc.StandardOutput.ReadLine();
        //       Console.WriteLine(temp);
        //   }


    }
    void receive(object e, DataReceivedEventArgs outLines)
    {
        System.Console.WriteLine("Line = " + outLines.Data);
    }


}


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

"пока" и "обработчик"
но все провалилось

моя программа python дает результат с помощью функции "print".
и я попробовал
печатать("~~~~");
print("~~~\n");
print("~~~\r\n");

2 Ответов

Рейтинг:
1

Richard MacCutchan

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


Member 14367686

запись ведется только в моей программе python, а чтение-только в моей программе C#.
как я могу синхронизировать обе программы?
кажется, что он читает все за 60 секунд

я не видел этой проблемы от другого поиска в google.
мои данные - это лишь некоторые из них. но почему эта проблема возникла только в моем проекте

Richard MacCutchan

Как я уже объяснял, вы запускаете два независимых процесса без синхронизации между ними. Это означает, что Windows будет решать, какой из них активируется в любой данный момент, поэтому нет никакого способа синхронизировать данные между ними.

Member 14367686

когда я тестирую с большим количеством данных, это событие происходит часто.
похоже, что ReadLine происходит, когда buff полон, и он не может найти EndofLine.
есть ли здесь у кого-нибудь такая проблема?

Richard MacCutchan

Нет никакого решения. Если вы хотите, чтобы эти два процесса были синхронизированы, то вы не можете запустить их таким образом. Они должны взаимодействовать друг с другом, чтобы писатель сообщал читателю, когда появляется больше данных. Вы можете попробовать розетки или, возможно, трубы, но вы не можете ожидать, что система будет знать, что вы хотите.

Рейтинг:
0

Gerry Schmitz

Ваш bash и консоль пишут в "стандартный вывод"; получите один для записи в что-то другое (например, ошибка std). Не знаю, насколько сложны эти компоненты.

Процесс.Свойство StandardOutput (System.Диагностика) | Microsoft Docs[^]


Member 14367686

Я сменил консоль.запись в пользовательский интерфейс на textview. Но это все еще не решено