starting some Python script from C#

G

Gerard Flanagan

tatamata said:
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
}
 
T

tatamata

thanks.

Gerard Flanagan said:
---------------------------------------------------------------------------------
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
}
---------------------------------------------------------------------------------

HTH

Gerard
 
T

tatamata

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.

StartWithCreateProcess()
Start()
Start()
Main() - c:\Documents and Settings\Zlatko\My Documents\SharpDevelop
Projects\CS_script\CS_script\Main.cs:32,5 "

The C# code is the following:

/*
* 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.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;

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 "
 
G

Gerard Flanagan

Gerard Flanagan said:
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)
 
T

tatamata

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 said:
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)
 
G

Gerard Flanagan

Gerard Flanagan said:
grupi:[email protected]...
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
}
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)
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

Gerard
 
Joined
May 28, 2008
Messages
1
Reaction score
0
executing python script from memory

Hi,

is there any way of loading a python script to memory and execute it from there, instead of go to de hard drive each time te script is executed?

Something like execute the script in memory instead from a location in the hard drive.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top