我想通过命令提示符从C#运行python代码。代码附在下面
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.WorkingDirectory = @"d:";
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.Start();
p.StandardInput.WriteLine(@"cd D:\python-source\mypgms");
p.StandardInput.WriteLine(@"main.py -i example-8.xml -o output-8.xml");
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
Console.WriteLine("Output:");
Console.WriteLine(output);
Output :
D:\python-source\mypgms>main.py -i example-8.xml -o output-8.xml
D:\python-source\mypgms>
但没有发生任何事情。实际上,main.py是我的主要程序,需要2个参数。一个是输入xml文件,另一个是转换输出xml文件。
但是我不知道如何通过命令提示符从C#运行这个python脚本。请指导我摆脱这个问题...
谢谢&问候, P.SARAVANAN
答案 0 :(得分:4)
我认为您在执行cmd.exe时遇到了错误。我会说你应该执行python.exe,或者执行main.py并将UseShellExecute设置为true。
目前,您的代码在p.WaitForExit()处阻塞,因为cmd.exe正在等待您的输入。您需要键入exit以使cmd.exe终止。您可以将其添加到您的代码中:
p.StandardInput.WriteLine(@"exit");
但我会完全删除cmd.exe并直接调用python.exe。据我所知,cmd.exe只是增加了额外的复杂性,绝对没有任何好处。
我认为你需要这些内容:
var p = new Process();
p.StartInfo.FileName = @"Python.exe";
p.StartInfo.Arguments = "main.py input.xml output.xml";
p.StartInfo.WorkingDirectory = @"D:\python-source \mypgms";
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
p.WaitForExit();
此外,Python脚本似乎输出到文件而不是stdout。所以当你做p.StandardOutput.ReadToEnd()时,那里什么也没有。
答案 1 :(得分:2)
为什么不在您的应用中托管IronPython然后执行脚本?
http://blogs.msdn.com/b/charlie/archive/2009/10/25/hosting-ironpython-in-a-c-4-0-program.aspx
http://www.codeproject.com/Articles/53611/Embedding-IronPython-in-a-C-Application
答案 2 :(得分:0)
或使用py2exe将您的python脚本实际转换为exe程序。
详细步骤......
setup.py应包含...
from distutils.core import setup
import py2exe
setup(console=['main.py'])
你的c#代码可以......
var proc = new Process();
proc.StartInfo.FileName = @"Python.exe";
proc.StartInfo.Arguments = @"setup.py py2exe";
proc.StartInfo.WorkingDirectory = @"C:\temp\";
proc.Start();
proc.WaitForExit();
proc.StartInfo.FileName = @"C:\temp\dist\main.exe";
proc.StartInfo.Arguments = "input.xml output.xml";
proc.Start();
proc.WaitForExit();