【问题标题】:Is this possible to run a python code from C# through command prompt?这是否可以通过命令提示符从 C# 运行 python 代码?
【发布时间】:2012-05-02 16:11:48
【问题描述】:

我想通过命令提示符从 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.萨拉瓦南

【问题讨论】:

  • 您希望发生什么?为什么要涉及 cmd.exe?为什么不运行 python.exe?
  • 这里的主要问题是 cmd.exe 不解释 python 代码。你需要 python.exe 来做到这一点。

标签: c# python c#-4.0


【解决方案1】:

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

【讨论】:

  • @Thanks David Heffernan:工作正常...但是命令提示符窗口立即关闭。如何防止窗口自动关闭?...
【解决方案2】:

【讨论】:

  • 这是另一种选择,但它并不能真正解决这里的问题。从 C# 调用 CPython 完全没有问题。它只需要正确地完成。与切换到托管 IronPython 相比,对代码进行一些简单的更改肯定会更快吗?
【解决方案3】:

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

【讨论】:

  • 那么 Q 中的代码将给出相同的行为,但在构建过程中会有额外的复杂性。
  • 它不会给出相同的行为。他可以选择手动或务实地将 main.py 转换为 main.exe。然后直接用进程调用main.exe。当然,这种方法无论如何都需要 python,但这只是另一种选择。
  • 如果他继续通过 cmd.exe 调用它将给出相同的行为。 Python exe 包装器的全部意义在于它们的行为与通过解释器运行脚本相同。您的回答没有解决根本问题。
  • 这是非常糟糕的建议。您已经展示了如何从 C# 调用 python.exe,因此您只需执行此操作并将 .py 文件作为参数传递。 py2exe 在这里是一个非常疯狂的想法。关键是要避免你做的 cmd.exe 。顺便说一句,这是我回答的重点。
  • @RayCheng :它抛出错误,如导入错误:没有名为 py2exe 的模块......这里有什么问题?
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多