starting some Python script from C#

tatamata zlatko.matic1 at sb.t-com.hr
Mon May 29 16:21:25 EDT 2006


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...

/*
 * Created by SharpDevelop.
 * User: Zlatko
 * Date: 28.5.2006
 * Time: 9:38
 *
 * To change this template use Tools | Options | Coding | Edit Standard 
Headers.
 */
using System;
using System.IO;
using System.Collections.Generic;
using System.Diagnostics;
using System.ComponentModel;
using System.Windows.Forms;

namespace CS_script
{

 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();

               //string output = myProcess.StandardOutput.ReadToEnd();
               //Console.WriteLine(output);

               //Console.WriteLine(myProcess.StandardOutput.ReadToEnd());

               //TextReader t = myProcess.StandardOutput;
               //MessageBox.Show(t.ReadToEnd());

               // 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

"Gerard Flanagan" <grflanagan at yahoo.co.uk> je napisao u poruci interesnoj 
grupi:1148815194.860060.43810 at j73g2000cwa.googlegroups.com...
>> "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)
> 





More information about the Python-list mailing list