starting some Python script from C#

Gerard Flanagan grflanagan at yahoo.co.uk
Tue May 30 08:59:09 EDT 2006


> >> "Gerard Flanagan" <grflanagan at yahoo.co.uk> je napisao u poruci interesnoj
> >> grupi:1148728940.440692.166330 at i39g2000cwa.googlegroups.com...
> >> > tatamata wrote:
> >> >> Hello.
> >> >>
> >> >> How can I run some Python script within C# program?
> >> >>
> >> >
> >> > ---------------------------------------------------------------------------------
> >> >            ProcessStartInfo startInfo;
> >> >            Process process;
> >> >            string directory;
> >> >            string pyArgs;
> >> >            string script;
> >> >
> >> >            startInfo = new ProcessStartInfo("python");
> >> >            startInfo.WorkingDirectory = directory;
> >> >            startInfo.Arguments = script + " " + pyArgs;
> >> >            startInfo.UseShellExecute = false;
> >> >            startInfo.CreateNoWindow = true;
> >> >            startInfo.RedirectStandardOutput = true;
> >> >            startInfo.RedirectStandardError = true;
> >> >
> >> >            process = new Process();
> >> >            process.StartInfo = startInfo;
> >> >            process.Start();
> >> >
> >> >            string s;
> >> >            while ((s = process.StandardOutput.ReadLine()) != null)
> >> >            {
> >> >                //do something with s
> >> >            }
> >> > ---------------------------------------------------------------------------------
> >> >
> >
> > tatamata wrote:
> >> Hello. I tried to implement ypour suggestion, but an error apears:
> >> "Exception System.ComponentModel.Win32Exception was thrown in debugee:
> >> The specified executable is not a valid Win32 application.
> >>
> >> namespace CS_script
> >> {
> >>  class MainClass
> >>  {
> >>   public static void Main(string[] args)
> >>   {
> >>
> >>     System.Diagnostics.ProcessStartInfo psi =new
> >> System.Diagnostics.ProcessStartInfo();
> >>     psi.FileName="my_script.py";
> >>     psi.WorkingDirectory=Environment.CurrentDirectory;
> >>     psi.RedirectStandardOutput = true;
> >>     psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
> >>     psi.UseShellExecute = false;
> >>     psi.CreateNoWindow = true;
> >>
> >>     System.Diagnostics.Process script;
> >>     script = System.Diagnostics.Process.Start(psi);
> >>
> >>     System.IO.StreamReader myOutput = script.StandardOutput;
> >>     script.WaitForExit(2000);
> >>     if (script.HasExited)
> >>      {
> >>      string output = myOutput.ReadToEnd();
> >>      //this.processResults.Text = output;
> >>     }
> >>     MessageBox.Show("finished!");
> >>   }
> >>  }
> >> }
> >>
> >> When running the program, I have the following error:
> >>
> >> "Exception System.ComponentModel.Win32Exception was thrown in debugee:
> >> The specified executable is not a valid Win32 application.
> >>
> >> StartWithCreateProcess()
> >> Start()
> >> Start()
> >> Main() - c:\Documents and Settings\Zlatko\My Documents\SharpDevelop
> >> Projects\CS_script\CS_script\Main.cs:32,5  "
> >>
> >
> >
> > I have no means of running C# programs at present and can't claim much
> > expertise in any case.  A guess is that a "valid Win32 application"
> > means an '.exe' file, not a '.py' file.
> >
> > You are assuming that a Process object is as smart as the command
> > interpreter ('cmd.exe') and will know to use 'python.exe' for a file
> > with a 'py' extension?
> >
> > What happens if you use 'python.exe' (or 'cmd.exe') as your file and
> > the script name as argument as in the code I posted?
> >
> > Gerard
> >
> >
> > (PS. This group prefers that one doesn't top-post)
> >

tatamata wrote:
> Hello. It seems that the following code works. And it seems that Process
> object can automatically run script by using python.exe, but only if
> standard output is not redirected...
>
>  class MainClass
>  {
>   public static void Main(string[] args)
>   {
>    MyProcess myProcess = new MyProcess();
>             myProcess.ExecuteScript();
>             MessageBox.Show("Continue?","Application",
> MessageBoxButtons.OKCancel);
>   }
>  }
>  public class MyProcess
>     {
>         // These are the Win32 error code for file not found or access
> denied.
>         const int ERROR_FILE_NOT_FOUND =2;
>         const int ERROR_ACCESS_DENIED = 5;
>
>         /// <summary>
>         /// Executes a python script.
>         /// </summary>
>         public void ExecuteScript()
>         {
>             Process myProcess = new Process();
>
>             try
>             {
>                 // Get the path that stores the python script.
>                 //string myDocumentsPath
> =Environment.GetFolderPath(Environment.SpecialFolder.Personal);
>                 //If the script is placed in the same folder as C#
> executable, set the path to current directory:
>                 string myDocumentsPath=Environment.CurrentDirectory;
>
>                 //Set the fully qualified script name
>                 myProcess.StartInfo.FileName = myDocumentsPath +
> "\\my_script.py";
>
>                 //Execute the script:
>                 myProcess.Start();
>
>                // Wait for it to die...
>                myProcess.WaitForExit();
>
>                MessageBox.Show ("Python script is successfully executed!");
>
>             }
>             catch (Win32Exception e)
>             {
>                 if(e.NativeErrorCode == ERROR_FILE_NOT_FOUND)
>                 {
>                     Console.WriteLine(e.Message + ". Check the path.");
>                 }
>
>                 else if (e.NativeErrorCode == ERROR_ACCESS_DENIED)
>                 {
>                     // Note that if your word processor might generate
> exceptions
>                     // such as this, which are handled first.
>                     Console.WriteLine(e.Message +
>                         ". You do not have permission to print this file.");
>                 }
>             }
>         }
> }
>
> Greetings,
>
> Zlatko
>

Ok.  Glad you have a successful outcome. See the following for an
asynchronous approach with multiple threads:

      http://www.codeproject.com/csharp/launchprocess.asp

> >
> > (PS. This group prefers that one doesn't top-post)
> >

Gerard




More information about the Python-list mailing list