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

可以通过命令提示符从C#运行python代码吗?,c#,python,c#-4.0,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.Re

我想通过命令提示符从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是我的主程序,它需要两个参数。一个是输入xml文件,另一个是转换后的输出xml文件

但是我不知道如何通过命令提示符从C#运行这个python脚本。请引导我走出这个问题

谢谢和问候,
P.SARAVANAN

为什么不在应用程序中托管IronPython,然后执行脚本

或用于实用地将python脚本转换为exe程序

详细步骤

  • 下载并安装
  • 将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();

我认为您执行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脚本似乎输出到文件而不是标准输出。因此,当您执行p.StandardOutput.ReadToEnd()时,将什么都没有。

您希望发生什么?为什么要涉及cmd.exe?为什么不运行python.exe?这里的主要问题是cmd.exe不解释python代码。您需要python.exe来完成这项工作。然后,Q中的代码将给出相同的行为,但在构建过程中会有额外的复杂性。它不会给出相同的行为。他可以选择手动或实用地将main.py转换为main.exe。然后使用进程直接调用main.exe。当然,这种方法无论如何都需要python,但这只是另一种选择。如果他继续通过cmd.exe调用,它将给出相同的行为。Python exe包装器的全部要点是,它们的行为与通过解释器运行脚本的行为相同。你的回答没有解决根本问题。这是一个非常糟糕的建议。您已经演示了如何从C#调用python.exe,因此您只需这样做并将.py文件作为参数传递。py2exe在这里是一个完全疯狂的想法。关键是要避免使用cmd.exe。顺便说一句,这是我回答的要点。@RayCheng:它抛出了类似导入错误的错误:没有名为py2exe的模块……这里有什么问题?这是另一个选项,但它并没有真正解决这里的问题。从C#调用CPython完全没有问题。这只是需要做对。当然,对代码进行一些简单的更改比切换到托管IronPython要快得多吗?@谢谢David Heffernan:它工作得很好……但是命令提示符窗口立即关闭。如何防止窗口自动关闭?。。。