C#에서 외부 프로그램 실행 후 출력 결과 가져오는 방법
😢상황
- 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
를 사용한 출력 리다이렉션은 매우 유용한 기법입니다!