2009-04-14 16 views
5

Próbowałem używać klasy Proces jak zawsze, ale to nie zadziałało. Wszystko, co robię, to próba uruchomienia pliku Pythona, tak jak ktoś go dwukrotnie kliknął.Jak wykonać plik powłoki w języku C#?

Czy to możliwe?

EDIT:

Przykładowy kod:

string pythonScript = @"C:\callme.py"; 

string workDir = System.IO.Path.GetDirectoryName (pythonScript); 

Process proc = new Process (); 
proc.StartInfo.WorkingDirectory = workDir; 
proc.StartInfo.UseShellExecute = true; 
proc.StartInfo.FileName = pythonScript; 
proc.StartInfo.Arguments = "1, 2, 3"; 

nie dostanę żadnych błędów, ale skrypt nie jest uruchamiany. Kiedy uruchomię skrypt ręcznie, widzę wynik.

+0

Czy możesz podzielić się swoim kodem? –

+0

Co masz na myśli mówiąc "nie działa"? –

+0

Czy to była klasa System.Diagnostics.Process? na przykład http://blogs.msdn.com/csharpfaq/archive/2004/06/01/146375.aspx –

Odpowiedz

7

Oto mój kod do wykonywania skryptu Pythona z C#, z przekierowanym standardowym wejściem i wyjściem (przekazuję informacje za pośrednictwem standardowego wejścia), skopiowany z przykładu w Internecie gdzieś. Lokalizacja Pythona jest zakodowana na sztywno, jak widać, może być zmieniona.

private static string CallPython(string script, string pyArgs, string workingDirectory, string[] standardInput) 
    { 

     ProcessStartInfo startInfo; 
     Process process; 

     string ret = ""; 
     try 
     { 

      startInfo = new ProcessStartInfo(@"c:\python25\python.exe"); 
      startInfo.WorkingDirectory = workingDirectory; 
      if (pyArgs.Length != 0) 
       startInfo.Arguments = script + " " + pyArgs; 
      else 
       startInfo.Arguments = script; 
      startInfo.UseShellExecute = false; 
      startInfo.CreateNoWindow = true; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.RedirectStandardError = true; 
      startInfo.RedirectStandardInput = true; 

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


      process.Start(); 

      // write to standard input 
      foreach (string si in standardInput) 
      { 
       process.StandardInput.WriteLine(si); 
      } 

      string s; 
      while ((s = process.StandardError.ReadLine()) != null) 
      { 
       ret += s; 
       throw new System.Exception(ret); 
      } 

      while ((s = process.StandardOutput.ReadLine()) != null) 
      { 
       ret += s; 
      } 

      return ret; 

     } 
     catch (System.Exception ex) 
     { 
      string problem = ex.Message; 
      return problem; 
     } 

    } 
+0

Dzięki, czy wiesz, jak programowo uzyskać lokalizację Pythona? –

5

Process.Start powinien działać. jeśli nie, czy zamieściłbyś swój kod i błąd, który otrzymujesz?

3

Zapomniałeś proc.Start() na końcu. Kod, który masz, powinien działać, jeśli zadzwonisz do Start().

Powiązane problemy