2015-08-04 4 views
0

Я работаю над запуском простого скрипта python через мою программу C# через класс Process. Вот код, я использую на самом деле запустить скрипт:Объект процесса, выполняющий скрипт Python, не перенаправляет вывод успешно

public PythonScript (string filePathDir, string args, Action<string> write) 
    { 
     this.filePathDir = filePathDir; 
     this.args = args; 
     this.write = write; 

     script_thread = new Thread (Run); 
     script_thread.Start(); 
    } 

    private void Run() 
    { 
     process = new ProcessStartInfo(); 
     process.Arguments = args; 
     process.FileName = filePathDir; 
     process.UseShellExecute = false; 
     process.RedirectStandardOutput = true; 

     p = Process.Start (process); // p is declared as "Process p;" 
     while (true) { 
      write ("running"); 
      string foo = p.StandardOutput.ReadLine(); 
      write ("running1"); 
      write (foo); 
     } 
    } 

Путь я на самом деле создать свой объект PythonScript является:

PythonScript py = new PythonScript("python3", "HeartAPI.py", Write)

где записи мой метод вывода (для печать информации). Форматирование для этого происходит от here. (обратите внимание: я пишу python3 вместо python.exe или что-то еще, потому что я работаю в среде KUbuntu)

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю свой скрипт (это базовый api), api доступен и доступен, но каждый раз, когда у моего скрипта python есть вызов print(), ничего не выводится через мою функцию Write. Тем не менее, я знаю, что это не так, как я передаю метод, так как звонок write("running"); работает, и он отображается.

Кто-нибудь есть идеи, почему мой поток вывода python НЕ проходит до моего метода write? Я не смог найти другие примеры в Интернете с этой проблемой, поэтому любая помощь будет оценена!

EDIT: уточнить. Мой скрипт python запускается и успешно завершает свои операции. Тем не менее, вывод этого сценария НЕ будет перенаправлен соответствующим образом, насколько я могу судить. Метод Write(string), передаваемый в объект PythonScript, работает корректно, так как команда write("running"); отлично работает и отображается так, как должна. Почему вывод сценария Python не перенаправляется в мой метод write()?

EDIT 2: В ответ на ответ, который я пробовал, я добавил script_thread.Join() звонок под остальную часть кода в моем PythonScript конструкторе. Вот обновленный код:

public PythonScript (string filePathDir, string args, Action<string> write) 
    { 
     this.filePathDir = filePathDir; 
     this.args = args; 
     this.write = write; 

     script_thread = new Thread (Run); 
     script_thread.Start(); 
     script_thread.Join(); 
     Console.WriteLine ("JOINED"); 
    } 

Я также добавил вызов для вывода на консоль действительно указывают, когда поток присоединяется, который никогда не получает выход. При попытке этого кода окно моего графического интерфейса никогда не появляется. Однако у меня есть система протоколирования в месте, которое было написано, и это был выход, который должен был пойти в мой GUI консоли:

running 
11:11:44- Closing down Heart... 
11:11:44- Goodbye. 
11:11:44- running1 
11:11:44- 
11:11:44- running 
11:11:44- running1 
11:11:44- 
11:11:44- running 
11:11:44- running1 
11:11:44- 
11:11:44- running 
11:11:44- running1 
11:11:44- 
11:11:44- running 
11:11:44- running1 
11:11:44- 
11:11:44- running 
11:11:44- running1 
11:11:44- 
11:11:44- running 
11:11:44- running1 

Закрытие сердце ... вызывается, когда графический интерфейс велено закрыть. Поэтому я не совсем уверен, что здесь происходит, но это то, что было сделано с добавлением вызова Join().

ответ

1

Можете ли вы поместить sys.stdout.flush() после того, как вы печатаете что-то в вашем питона скрипт или же напечатать некоторые дополнительные новые линии. Причина, по которой вы не получаете какой-либо вывод, может быть из-за буфера stdout python3.

+1

Это фактически исправило мою проблему, спасибо тонну !!!! – PulsePanda

0

Я не вижу вызова script_thread.Join(). Я подозреваю, что процесс C# заканчивается до того, как процесс python распечатает свою первую строку.

Попробуйте это:

public PythonScript (string filePathDir, string args, Action<string> write) 
{ 
    this.filePathDir = filePathDir; 
    this.args = args; 
    this.write = write; 

    script_thread = new Thread (Run); 
    script_thread.Start(); 
    script_thread.Join(); // Wait for the thread to terminate. 
} 
+0

Когда я добавляю вызов 'Join()', окно GUI фактически никогда не появляется. Однако в терминах закрытия потока у меня есть отдельный метод для того, который вызывается при закрытии GUI. Сценарий python - это постоянный API, который зацикливается, я могу опубликовать этот код и в моем вопросе, если это поможет. Кроме того, с этим 'Join()' вызов, система журнала у меня на месте показывает, что были следующие результаты: работает закрытие сердце ... Прощай running1 работает running1 работает running1 работает running1 Закрытие сердца выводится, когда gui закрыт. Таким образом, я не на 100%, что это означает либо – PulsePanda

+0

. Более чистый ответ в Редактировании 2 – PulsePanda

Смежные вопросы