1 분 소요

😢상황

  • C#으로 작성한 프로그램에서 외부 프로그램(exe 또는 스크립트) 을 실행하고 싶음
  • 단순 실행뿐 아니라, 해당 프로그램이 콘솔에 출력한 결과를 코드 내에서 받아서 처리하고자 함
  • 예를 들어, Python 스크립트 또는 커맨드 라인 유틸리티의 실행 결과를 읽어오고 싶음

🛠️해결법

✅ 핵심 방법: System.Diagnostics.Process 사용

using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        // 1. Process 설정
        ProcessStartInfo psi = new ProcessStartInfo();
        psi.FileName = "python"; // 실행할 프로그램 이름 (예: python, notepad, mytool.exe 등)
        psi.Arguments = "hello.py"; // 실행 시 전달할 인자
        psi.RedirectStandardOutput = true; // 출력 리다이렉트
        psi.RedirectStandardError = true;  // 에러 리다이렉트 (선택)
        psi.UseShellExecute = false; // 반드시 false여야 리다이렉트 가능
        psi.CreateNoWindow = true; // 별도 콘솔 창 띄우지 않음

        // 2. Process 실행
        using (Process process = Process.Start(psi))
        {
            // 3. 출력 읽기
            string output = process.StandardOutput.ReadToEnd();
            string error = process.StandardError.ReadToEnd();

            // 4. 종료 대기
            process.WaitForExit();

            // 5. 결과 출력
            Console.WriteLine("표준 출력:");
            Console.WriteLine(output);

            if (!string.IsNullOrEmpty(error))
            {
                Console.WriteLine("표준 에러:");
                Console.WriteLine(error);
            }
        }
    }
}

🔁 비동기 방식으로 실시간 출력 받기

process.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data);
process.BeginOutputReadLine();

💡 표준 출력이 생길 때마다 실시간으로 받아서 콘솔에 출력


정리: 왜 이게 효과 있었는가?

  • RedirectStandardOutput = true 설정을 통해 외부 프로그램의 출력을 C# 프로그램 내부로 가져올 수 있음
  • UseShellExecute = false 설정은 반드시 필요 (리다이렉트가 가능해짐)
  • ReadToEnd() 메서드로 한 번에 전체 출력 읽기 가능하며, BeginOutputReadLine()으로 실시간 처리도 가능
  • 실행 결과를 가공하거나 사용자에게 보여주는 등 다양한 활용 가능

👉 외부 도구와의 연동이 필요한 상황에서 Process를 사용한 출력 리다이렉션은 매우 유용한 기법입니다!