Send Python Output to File from C# - c#

I want to get the output and error messages after running a python script from C#. The output works, however if there's an error in the python script the output returns as "" and I can't get the error. The error displays correctly if the python script is run from Windows shell.
As a workaround I'd like to output from the python script to a txt file and then read the text file in C#. The below works in shell to write for the file mylog.log.
python c:\temp\text.py 2>&1 | tee -filePath mylog.log
If I run the code below in C# no mylog.log file is created.
public string RunFile(string fileName)
{
fileName = #"c:\temp\text.py 2>&1 | tee -filePath c:\temp\myLog.log";
Process p = new Process();
p.StartInfo = new ProcessStartInfo(#"python", fileName)
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
WorkingDirectory = #"c:\temp"
};
p.Start();
p.WaitForExit();
string output = p.StandardOutput.ReadToEnd();
return output;
}

Thanks for the comments. I've just enabled redirect of the error and am reading the error in C#.
Process p = new Process();
p.StartInfo = new ProcessStartInfo(#"python", fileName)
{
RedirectStandardError = true,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
WorkingDirectory = #"c:\temp"
};
p.Start();
p.WaitForExit();
string output = p.StandardOutput.ReadToEnd();
string error = p.StandardError.ReadToEnd();

Related

Exectute a Linux Shell command from ASP.NET Core 3 app

My question is literally, how do I execute a Shell command from my application. There is a similar Post, but that shows how to execute a script file and requires the path to that file.
var process = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = command, // Path required here
Arguments = args,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
process.Start();
Why I want to pass the command as a string?
Because I want to interpolate it. Otherwise, I would have to create a script, with some input parameters. Since I'm not that good with Shell, I prefer the easy way.
Assume you want to run echo hello in bash, then
Process process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "bash",
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false
}
};
process.Start();
await process.StandardInput.WriteLineAsync("echo hello");
var output = await process.StandardOutput.ReadLineAsync();
Console.WriteLine(output);

'The specified executable is not a valid application for this OS platform

I want to print a PDF file from C# code without user interaction.
I tried this accepted answer but it is not working for me.
This is the code I tried:
Process p = new Process();
p.StartInfo = new ProcessStartInfo()
{
CreateNoWindow = true,
Verb = "print",
FileName = #"G:\Visual Studio Projects\PrintWithoutGUI\PrintWithoutGUI\Courses.pdf" //put the correct path here
};
p.Start();
I get this exception :
System.ComponentModel.Win32Exception: 'The specified executable is not a valid application for this OS platform.'`
try this by add UseShellExecute=true it will print to default printer but if you want to print to a specific print change the verb print to verb printTo by spefiying the name of the printer Arguments proprety.
private static void PrintByProcess()
{
using (Process p = new Process())
{
p.StartInfo = new ProcessStartInfo()
{
CreateNoWindow = true,
UseShellExecute=true,
Verb = "print",
FileName = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\doc.pdf"
};
p.Start();
}
this is the correct way to write your code
Process p = new Process();
p.StartInfo = new ProcessStartInfo()
{
CreateNoWindow = true,
Verb = "print",
FileName = "PDfReader.exe", //put the path to the pdf reading software e.g. Adobe Acrobat
Arguments = "PdfFile.pdf" // put the path of the pdf file you want to print
};
p.Start();

Running node command with Process results in error: The process with PID xxxx (child process of PID xxxx) could not be terminated

I am attempting to kick off a node command via C# code using System.Diagnostics.Process and System.Diagnostics.ProcessStartInfo but encounter this error on my test system (no such error on the development system).
Output of this command is piped to a text file and that is where the error is written.
string filename = string.Format("\"{0}\"", nodePath);
string arguments = string.Format("\"{0}\" -u \"{1}\" -p \"{2}\" > \"{3}\"",
scriptPath, uName, pword, outFileName);
ProcessStartInfo si = new ProcessStartInfo
{
FileName = filename,
Arguments = arguments,
CreateNoWindow = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false,
RedirectStandardError = true
};
Process p = new Process
{
StartInfo = si
};
string statusMessage = String.Format("Executing command: '{0}'", si.FileName);
Logger.LogDomInfo(statusMessage);
bool started = p.Start();
As I mentioned before, this runs just fine on the development machine but fails on the test environment with this error:
ERROR: The process with PID 4880 (child process of PID 5440) could not be terminated.
Reason: There is no running instance of the task.

Executing Batch File on Remote Server Itself using C#

I need to execute a batch file on remote server itself . I was using the below code as i found as an example but the batch file is getting executing on the application server itself and not on the remote server. If i need to create a log file using the batch file on remote server , it was throwing error stating file path cannot be found .Thanks for the help in advance
if (File.Exists(filePath))
{
var process = new Process();
var startInfo = new ProcessStartInfo
{
CreateNoWindow = true,
FileName = "cmd.exe",
Arguments = "/c \"\"" + filePath + "\"\"",
WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory,
//WorkingDirectory = workingdirectory,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true
};
process.StartInfo = startInfo;
process.Start();
//process.WaitForExit(30000);
string output = process.StandardOutput.ReadLine();
string errors = process.StandardError.ReadLine();
The work around for executing the batch file on remote server itself is to do a windows scheduler job and trigger the job by some c# code .Please find the below code to do that
string job = #"""\JobLocation\JobName""";
string server = #"XXXXXXXXXXX";
string user = #"Domian\XXXXXX";
string pwd = #"XXXXXXXXXXXXXXX";
string line = #" /run /tn " + job + " /s " + server + " /u " + user + " /p " + pwd;
var process = new Process();
var startInfo = new ProcessStartInfo
{
CreateNoWindow = true,
FileName = #"C:\WINDOWS\SYSTEM32\schtasks.exe",
WindowStyle = ProcessWindowStyle.Hidden,
Arguments = line,
//WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true
};
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
string output = process.StandardOutput.ReadLine();
string errors = process.StandardError.ReadLine();code here

can not get out put from pg_dump.exe command line

i'm developing an application to get backup from my postgreSQL database with C#.
i,m using code below to execute and get out put from pg_dump.exe.
ProcessStartInfo startinfo = new ProcessStartInfo
{
FileName = "\"C:\\Program Files (x86)\\pgAdmin III\\1.16\\pg_dump.exe\"",
Arguments = "--host XXX.XXX.XXX.XXX --port 5432 --username \"USERNAME\" --no-password --format plain --verbose --file \"D:\\MYBACKUP.backup\" \"MYDBNAME\"",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
Process proc = new Process();
proc.StartInfo = startinfo;
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
var r = proc.StandardOutput.ReadLine();
}
proc.WaitForExit();
Console.WriteLine(proc.ExitCode);
Console.ReadLine();
but proc.StandardOutput.ReadLine always returns null!!!
i try to put pg_dump.exe output to a file with command propt like this:
C:\Program Files (x86)\pgAdmin III\1.16>pg_dump.exe > d:\log.txt
but again log.txt is empty!!
thanks in advance.
Replace RedirectStandardOutput with RedirectStandardError.
My working code is:
ProcessStartInfo startinfo = new ProcessStartInfo
{
FileName = "Path to pg_dump.exe",
Arguments = "Arguments",
UseShellExecute = false,
RedirectStandardError = true,
CreateNoWindow = true
};
using (Process process = Process.Start(startinfo))
{
using (StreamReader reader = process.StandardError)
{
StreamWriter sw = new StreamWriter(#"C:\log.txt");
sw.WriteLine(reader.ReadToEnd());
sw.Close();
}
}

Categories