[C#] 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위치를 전달하면 내가 통과해야 들었다 는 AS 후, 은 AS .cmdfilenameargspython.execmdcode.py filenameargs

나는 잠시 동안 찾고 있었고 IronPython 등을 사용하도록 제안하는 사람들 만 찾을 수 있습니다. 그러나 C #에서 Python 스크립트를 호출하는 방법이 있어야합니다.

몇 가지 설명 :

C #에서 실행해야하고 출력을 캡처해야하며 IronPython 또는 다른 것을 사용할 수 없습니다. 해킹이 무엇이든 괜찮을 것입니다.

추신 : 내가 실행중인 실제 Python 코드는 이것보다 훨씬 복잡하며 C #에서 필요한 출력을 반환하며 C # 코드는 지속적으로 Python 코드를 호출합니다.

이것이 내 코드 인 척 :

    private void get_vals()
    {
        for (int i = 0; i < 100; i++)
        {
            run_cmd("code.py", i);
        }
    }



답변

작동하지 않는 이유는 귀하가 있기 때문 UseShellExecute = false입니다.

셸을 사용하지 않으면 python 실행 파일의 전체 경로를 로 제공하고 스크립트와 읽을 파일을 모두 제공 FileName하는 Arguments문자열을 작성해야합니다.

또한를 RedirectStandardOutput제외 하고는 할 수 없습니다 UseShellExecute = false.

파이썬에서 인수 문자열의 형식을 지정하는 방법을 잘 모르겠지만 다음과 같은 것이 필요합니다.

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


답변

IronPython을 사용하려는 경우 C #에서 직접 스크립트를 실행할 수 있습니다.

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

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

IronPython을 받으십시오.


답변

C에서 Python 스크립트 실행

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

        }
    }
}

파이썬 sample_script

"Python C # Test"인쇄

당신은 볼 것이다 ‘파이썬 C # 테스트’ C 번호의 콘솔에서.


답변

나는 똑같은 문제에 부딪 쳤고 도덕성 마스터의 대답은 나를 위해 그것을하지 않았다. 이전 답변을 기반으로 다음이 작동했습니다.

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는 cmd 행 인수 100으로 test.py를 실행하려는 경우 @C:/Python26/python.exeargs가 C://Python26//test.py 100됩니다. .py 파일의 경로에는 @ 기호가 없습니다.


답변

또한 이것에주의를 기울이십시오.

https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee

잘 작동합니다.


답변

Argument에서 WorkingDirectory를 설정하거나 python 스크립트의 전체 경로를 지정하십시오.

ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "C:\\Python27\\python.exe";
//start.WorkingDirectory = @"D:\script";
start.Arguments = string.Format("D:\\script\\test.py -a {0} -b {1} ", "some param", "some other param");
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
using (Process process = Process.Start(start))
{
    using (StreamReader reader = process.StandardOutput)
    {
        string result = reader.ReadToEnd();
        Console.Write(result);
    }
}


답변

실제로 Csharp (VS)와 Python과 IronPython을 쉽게 통합 할 수 있습니다. 그다지 복잡하지는 않습니다 … Chris Dunaway는 이미 답변 섹션에서 말했듯이 내 프로젝트를 위해이 통합을 구축하기 시작했습니다. N은 매우 간단합니다. 다음 단계를 따르면 N 결과를 얻을 수 있습니다.

1 단계 : VS를 열고 비어있는 새 ConsoleApp 프로젝트를 작성하십시오.

2 단계 : 도구-> NuGet 패키지 관리자-> 패키지 관리자 콘솔로 이동합니다.

3 단계 :이 후 브라우저에서이 링크를 열고 NuGet 명령을 복사하십시오. 링크 : https://www.nuget.org/packages/IronPython/2.7.9

4 단계 : 위 링크를 연 후 PM> Install-Package IronPython -Version 2.7.9 명령을 복사하여 VS의 NuGet Console에 붙여 넣습니다. 지원 패키지를 설치합니다.

5 단계 : 이것은 Python.exe 디렉토리에 저장된 .py 파일을 실행하는 데 사용한 코드입니다.

using IronPython.Hosting;//for DLHE
using Microsoft.Scripting.Hosting;//provides scripting abilities comparable to batch files
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
class Hi
{
private static void Main(string []args)
{
Process process = new Process(); //to make a process call
ScriptEngine engine = Python.CreateEngine(); //For Engine to initiate the script
engine.ExecuteFile(@"C:\Users\daulmalik\AppData\Local\Programs\Python\Python37\p1.py");//Path of my .py file that I would like to see running in console after running my .cs file from VS.//process.StandardInput.Flush();
process.StandardInput.Close();//to close
process.WaitForExit();//to hold the process i.e. cmd screen as output
}
} 

6 단계 : 코드 저장 및 실행