这可以通过命令提示符从C#运行python代码吗?

时间:2012-04-21 07:02:20

标签: c# python c#-4.0

我想通过命令提示符从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

3 个答案:

答案 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)

答案 2 :(得分:0)

或使用py2exe将您的python脚本实际转换为exe程序。

详细步骤......

  • 下载并安装py2exe
  • 将main.py input.xml和output.xml放在c:\ temp \
  • 创建setup.py并将其放在上面的文件夹中

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