繁体   English   中英

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

[英]Is this possible to run a python code from C# through command prompt?

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

我认为您在执行cmd.exe时出错。 我想说的是您应该执行python.exe,或者在UseShellExecute设置为true的情况下执行main.py。

目前,您的代码在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()时,那里什么也没有。

或使用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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM