Python 스크립트에서 Python 인터프리터 및 / 또는 CMD.EXE의 출력을 캡처하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/24931

  •  09-06-2019
  •  | 
  •  

문제

  1. Python 스크립트에서 Python 인터프리터의 출력을 캡처 할 수 있나요?
  2. Python 스크립트에서 Windows CMD의 출력을 캡처 할 수 있습니까?

    그렇다면 어떤 라이브러리를 조사해야합니까?

도움이 되었습니까?

해결책

스크립트의 '부모'인 Python 인터프리터 또는 CMD.exe에 대해 이야기하고 있다면 불가능합니다. 모든 POSIX와 같은 시스템 (이제 Windows를 실행하고있는 것 같습니다. YMMV라는 몇 가지 특이한 점이있을 수 있음)에서 각 프로세스에는 표준 입력, 표준 출력 및 표준 오류의 세 가지 스트림이 있습니다. Bu 기본값 (콘솔에서 실행되는 경우)은 콘솔로 지정되지만 파이프 표기법을 사용하여 리디렉션이 가능합니다. 라코 디스

이것은 스크립트 a의 표준 출력 스트림을 스크립트 B의 표준 입력 스트림에 연결합니다.이 예제에서는 표준 오류가 여전히 콘솔로 이동합니다. Wikipedia의 표준 스트림 에 대한 기사를 참조하세요.

자식 프로세스에 대해 이야기하는 경우 Python에서 다음과 같이 시작할 수 있습니다 (양방향 통신을 원하는 경우 stdin도 옵션입니다). 라코 디스

프로세스 관리에 대한 정보는 Python 하위 프로세스 모듈을 참조하세요. 통신을 위해 process.stdin 및 process.stdout 파이프는 표준 파일 객체 <로 간주됩니다. / a>.

파이프와 함께 사용하는 경우 표준 입력에서 lassevk 는 다음과 같은 작업을 제안했습니다. 라코 디스

sys.stdin 및 sys.stdout은 sys 모듈. pipes 모듈을 살펴볼 수도 있습니다.

내 예제와 같이 readline ()으로 데이터를 읽는 것은 데이터를 얻는 아주 순진한 방법입니다. 출력이 행 지향적이지 않거나 결정적이지 않은 경우 폴링 안타깝게도 창에서는 작동하지 않지만 다른 대안이있을 것입니다.

다른 팁

질문의 첫 번째 부분에 대한 좋은 답변을 알려 드릴 수 있습니다. <인용구>

1. Python에서 Python 인터프리터의 출력을 캡처 할 수 있습니까? 스크립트?

정답은 ""이며 개인적으로 PEP 343-"with "진술 문서 라코 디스

다음과 같이 사용 : 라코 디스

좋은 점은 전체 범위가 아닌 스크립트 실행의 일부에만 선택적으로 적용 할 수 있으며 컨텍스트 내에서 처리되지 않은 예외가 발생하더라도 효과가 유지된다는 것입니다. 파일을 처음 사용한 후 추가 모드에서 다시 열면 결과를 단일 파일로 누적 할 수 있습니다. 라코 디스

물론 위의 내용을 확장하여 sys.stderr를 동일한 파일이나 다른 파일로 리디렉션 할 수도 있습니다. 관련 질문에 대한 답변 도 참조하세요.

사실, 당신은 확실히 할 수 있으며, 동시에 아름답고, 추하고, 미쳤습니다!

sys.stdout 및 sys.stderr을 출력을 수집하는 StringIO 개체로 바꿀 수 있습니다.

예를 들면 evil.py로 저장하세요. 라코 디스

이 프로그램을 실행하면 다음을 확인할 수 있습니다.

  • 아무것도 stdout에 들어 가지 않았습니다 (일반적으로 인쇄물이 인쇄되는 곳)
  • stderr에 기록되는 첫 번째 문자열은 'It'으로 시작하는 문자열입니다.
  • 다음 두 줄은 StringIO 개체에서 수집 된 줄입니다

    sys.stdout / err을 이와 같이 대체하는 것은 몽키 패칭이라는 응용 프로그램입니다.이것이 '지원'되는지 여부에 따라 의견이 다를 수 있으며 확실히 추악한 해킹이지만 외부 항목을 한두 번 감싸려고 할 때 베이컨을 구했습니다.

    Windows가 아닌 Linux에서 테스트되었지만 잘 작동합니다.Windows에서 작동하는지 알려주세요!

하위 프로세스 를 원합니다.17.1.1에서 Popen을 구체적으로 살펴보고 17.1.2에서 통신하세요.

어떤 맥락에서 질문하십니까?

명령 줄에서 시작한 프로그램의 출력을 캡처하려고합니까?

그렇다면 실행 방법은 다음과 같습니다. 라코 디스

출력을 읽으려면 표준 입력에서 읽기만하면됩니다.

반면에 프로그램 내에서 해당 스크립트 또는 cmd.exe 또는 이와 유사한 것을 실행하고 스크립트 / 프로그램이 완료 될 때까지 기다렸다가 모든 출력을 캡처하려면 다음을 확인해야합니다.외부 프로그램을 시작하는 데 사용하는 라이브러리 호출에서 출력을 읽고 완료를 기다릴 수있는 방법을 요청하는 방법이있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top