2015-07-01 3 views
3

Я хочу записать данные в существующий процесс-х STDIN от внешних процессов в окнах, и нашел аналогичный вопрос для Linux:
Запись в поток ввода запущенного процесса в окнах

How to write data to existing process's STDIN from external process?

How do you stream data into the STDIN of a program from different local/remote processes in Python?

https://serverfault.com/questions/443297/write-to-stdin-of-a-running-process-using-pipe

и т. Д., Но теперь я хочу знать, как я могу это сделать в окнах?
Я пытаюсь с этим кодом, но я получил ошибку!
также я пытаюсь запустить программу и отправить stdin на эту треску, но снова ошибка!

В CMD:

type my_input_string | app.exe -start 
my_input_string | app.exe -start 
app.exe -start < pas.txt 

В питона:

p = subprocess.Popen('"C:\app.exe" -start', 
stdin=subprocess.PIPE, universal_newlines=True, shell=True)  
    grep_stdout = p.communicate(input='my_input_string')[0] 

Ошибка заключается в следующем:

ReadConsole() не удалось: Недопустимый дескриптор.

И в C#:

 try 
     { 
      var startInfo = new ProcessStartInfo(); 
      startInfo.RedirectStandardInput = true; 
      startInfo.FileName = textBox1.Text; 
      startInfo.Arguments = textBox2.Text; 
      startInfo.UseShellExecute = false; 

      var process = new Process(); 
      process.StartInfo = startInfo; 
      process.Start(); 
      Thread.Sleep(1000); 
      var streamWriter = process.StandardInput; 
      streamWriter.WriteLine("1"); 
     } 
     catch (Exception ex) 
     { 
       textBox4.Text = ex.Message+"\r\n"+ex.Source; 
     } 

enter image description here В C# с этим кодом App.exe (whis командной строки приложения начинается с новым процессом) разбился! но в приложении C# у меня нет никакого исключения!
и я думаю, что для UseShellExecute = false;
Кроме того, когда я использую из C# и если не запускайте приложение в фоновом режиме я могу найти процесс и использовать из sendkeys отправить my_input_string на это, но это не хорошая идея, потому что пользователь см. командную строку при использовании графического интерфейса пользователя!

Как я могу отправить stdin без ошибок только с CMD или создать скрипт в python или C#!
Есть идеи?

С уважением.

+0

Эх, извините, но я не могу понять ... кто пишет кому? Python - C#? C# на Python? Вы хотите общий случай? – NightShadeQueen

+0

@NightShadeQueen Я хочу, чтобы написать stdin из python или C#, я пытаюсь написать скрипт в python и запустить его с C#. – Sara

+0

Проверьте модуль 'errorwindow.py' в [этом ответе] (http://stackoverflow.com/a/18091356/355230), потому что он делает то, что, я думаю, вы пытаетесь сделать. Основное различие заключается в том, что вывод одного процесса отправляется другому, печатая его (или записывая его в 'stderr'). Тот же модуль также использовался для выполнения чего-то подобного в этом [другом ответе] (http://stackoverflow.com/a/27932575/355230) моего вопроса по соответствующему вопросу. – martineau

ответ

3

Если вы запускаете, а затем подачи на вход от C#, вы можете сделать что-то вроде этого:

var startInfo = new ProcessStartInfo("path/to/executable"); 
startInfo.RedirectStandardInput = true; 
startInfo.UseShellExecute = false; 

var process = new Process(); 
process.StartInfo = startInfo; 
process.Start(); 

var streamWriter = process.StandardInput; 
streamWriter.WriteLine("I'm supplying input!"); 

Если вам нужно записать на стандартный ввод приложение уже запущено, я сомневаюсь, что это легко сделать с помощью классов .NET, как класс Process не даст вам StandardInput (это вместо того, чтобы бросаться InvalidOperationException)

Edit: Добавлен параметр ProcessStartInfo()

+0

Thnx для вашего ответа buy Я пытаюсь и когда я использую программу командной строки, разбился! а также никаких исключений! есть ли у вас другая идея? – Sara

+0

Запустите его в отладчике и сообщите мне информацию об исключении. – willaien

+0

Обновлен вопрос и добавьте pic, а в C# у меня нет исключения! – Sara

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