Вопрос-Ответ

How do I run a Python script from C#?

Как мне запустить скрипт Python из C #?

Такого рода вопросы в разной степени задавались раньше, но я чувствую, что на них не было краткого ответа, и поэтому я задаю его снова.

Я хочу запустить скрипт на Python. Допустим, это:

if __name__ == '__main__':
with open(sys.argv[1], 'r') as f:
s = f.read()
print s

Который получает местоположение файла, считывает его, затем печатает его содержимое. Не так уж и сложно.

Хорошо, итак, как мне запустить это на C #?

Это то, что у меня есть сейчас:

    private void run_cmd(string cmd, string args)
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = cmd;
start.Arguments = args;
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
using (Process process = Process.Start(start))
{
using (StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
Console.Write(result);
}
}
}

Когда я передаю code.py location as cmd и filename location as args, это не работает. Мне сказали, что я должен передать python.exe как cmd, а затем code.py filename как args.

Я уже некоторое время ищу и могу найти только людей, предлагающих использовать IronPython или что-то в этом роде. Но должен быть способ вызвать скрипт Python из C #.

Некоторые пояснения:

Мне нужно запустить его с C #, мне нужно зафиксировать выходные данные, и я не могу использовать IronPython или что-либо еще. Любой хак, который у вас есть, подойдет.

PS: Фактический код Python, который я запускаю, намного сложнее этого, и он возвращает выходные данные, которые мне нужны на C #, и код C # будет постоянно вызывать код Python.

Представьте, что это мой код:

    private void get_vals()
{
for (int i = 0; i < 100; i++)
{
run_cmd("code.py", i);
}
}
Переведено автоматически
Ответ 1

Причина, по которой он не работает, заключается в том, что у вас естьUseShellExecute = false.

Если вы не используете оболочку, вам придется указать полный путь к исполняемому файлу python как FileName, и создать Arguments строку для предоставления как вашего скрипта, так и файла, который вы хотите прочитать.

Также обратите внимание, что вы не можете, RedirectStandardOutput еслиUseShellExecute = false.

Я не совсем уверен, как строка аргумента должна быть отформатирована для python, но вам понадобится что-то вроде этого:

private void run_cmd(string cmd, string args)
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "my/full/path/to/python.exe";
start.Arguments = string.Format("{0} {1}", cmd, args);
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
using(Process process = Process.Start(start))
{
using(StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
Console.Write(result);
}
}
}
Ответ 2

Если вы хотите использовать IronPython, вы можете выполнять скрипты непосредственно на C#:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

private static void doPython()
{
ScriptEngine engine = Python.CreateEngine();
engine.ExecuteFile(@"test.py");
}

Получите IronPython здесь.

Ответ 3

Выполнить скрипт Python из C

Создайте проект на C # и напишите следующий код.

using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
run_cmd();
}

private void run_cmd()
{

string fileName = @"C:\sample_script.py";

Process p = new Process();
p.StartInfo = new ProcessStartInfo(@"C:\Python27\python.exe", fileName)
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
p.Start();

string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();

Console.WriteLine(output);

Console.ReadLine();

}
}
}

Python sample_script

вывести "Тест Python C #"

Вы увидите 'Python C# Test' в консоли C #.

Ответ 4

Я столкнулся с той же проблемой, и ответ Master Morality не решил ее за меня. Следующее, основанное на предыдущем ответе, сработало:

private void run_cmd(string cmd, string args)
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = cmd;//cmd is full path to python.exe
start.Arguments = args;//args is path to .py file and any cmd line args
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
using(Process process = Process.Start(start))
{
using(StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
Console.Write(result);
}
}
}

В качестве примера, cmd будет @C:/Python26/python.exe а args будет C://Python26//test.py 100, если вы хотите выполнить test.py с аргументом строки cmd 100. Обратите внимание, что путь к файлу .py не содержит символа @.

python