로그 파일에 하위 프로세스 stdout 및 stderr을 캡처하는 Python 함수

스티브

적은 양의 코드로 많은 일이 진행되고 있습니다. 나는 이것을 간결하게 유지하려고 노력할 것이다.

외부 프로그램을 실행하고 stdout과 stderr를 로그 파일에 모두 넣는 파이썬 함수가 있습니다.

doctest를 사용하여 기능을 테스트하고 있습니다. 출력 캡처 기능을 테스트해야합니다. 아래 코드는 함수와 테스트를 작성하려는 시도를 보여줍니다. 로그 파일에 아무것도 기록되지 않고 테스트가 실패합니다. 문제가 테스트에 있는지 테스트중인 코드에 있는지 또는 둘 다에 있는지 확실하지 않습니다. 제안?

from __future__ import print_function

import subprocess

def run(command_line, log_file):
    """
    # Verify stdout and stderr are both written to log file in chronological order
    >>> run("echo text to stdout; echo text to stderr 1>&2", "log")
    >>> f = open("log"); out = f.read(); f.close()
    >>> print(out.strip())
    text to stdout
    text to stderr
    """
    command_line = "set -o pipefail; " + command_line + " 2>&1 | tee " + log_file

    # Run command. Wait for command to complete. If the return code was zero then return, otherwise raise CalledProcessError
    subprocess.check_call(command_line, shell=True, executable="bash")

테스트 결과 :

$ python -m doctest testclass.py
text to stdout
text to stderr
**********************************************************************
File "testclass.py", line 10, in testclass.run
Failed example:
    print(out.strip())
Expected:
    text to stdout
    text to stderr
Got:
    <BLANKLINE>
**********************************************************************
1 items had failures:
   1 of   3 in testclass.run
***Test Failed*** 1 failures.
장 프랑수아 파브르

을하고 이후 subprocess.check_callshell=True이 표준 출력 / 표준 오류 리디렉션과 함께, tee명령 및 캡처 출력을 실행하는 가장 좋은 방법은 아니다 (실제로는 가장 근접한 최악의 방법), 나는 정말 실패 놀라게하고 있지 않다.

내 해결책은 set -o pipefailfor starters (여기에서 반환 코드를 확인할 필요가 없음)를 삭제하고 두 명령을 괄호로 묶고 그렇지 않으면 리디렉션 / tee는 마지막 명령에만 적용됩니다 (나는 여전히 출력이없는 이유에 대해 의아해합니다. , 솔직히 말해서) :

command_line = "(" + command_line + ") 2>&1 | tee " + log_file

복원해야하는 경우 pipefail괄호 안에 수행하십시오.

command_line = "(set -o pipefail; " + command_line + ") 2>&1 | tee " + log_file

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

변수를 구분하기 위해 프로그램 stdout 및 stderr 캡처

분류에서Dev

Python의 하위 프로세스 / Popen에서 stdout을 stderr로 리디렉션

분류에서Dev

내 Django 앱에서 Celery의 하위 프로세스 stdout 및 stderr에 액세스

분류에서Dev

ssh를 수행하는 동안 stdout 및 stderr 하위 프로세스

분류에서Dev

Python 하위 프로세스는 stdout 및 stderr를 억제합니다.

분류에서Dev

powershell-stdout 및 stderr를 파일로 캡처하는 동시에 터미널에 보관

분류에서Dev

자바 프로세스 : 단일 스레드에서 하위 프로세스의 stdout 및 stderr 읽기

분류에서Dev

"3 방향"Python 하위 프로세스 파이프 라인 : stdout 및 stderr를 두 개의 다른 프로세스로 전송 하시겠습니까?

분류에서Dev

로컬 파일에서 stdout을 캡처하면서 어떻게 stdout을 다른 프로세스로 파이프 할 수 있습니까?

분류에서Dev

Perl이 하위 프로세스의 STDERR 및 STDOUT을 포착합니다.

분류에서Dev

Haskell Turtle을 사용하여 프로세스에서 stdout 및 stderr 출력을 캡처하려면 어떻게해야합니까?

분류에서Dev

Windows의 Python에서 하위 프로세스의 stdout, stderr을 어떻게 테스트합니까?

분류에서Dev

Python 하위 프로세스 및 스트림을 실행하고 stdout 및 stderr도 필터링하는 방법은 무엇입니까?

분류에서Dev

콘솔과 파일 모두에 stdout 및 stderr을 표시하고 stderr을 빨간색으로 표시하고 stdout 및 stderr를 생성 할 때 표시합니다.

분류에서Dev

stdout 및 stderr을 읽고 하위 프로세스 Popen을 사용하여 한 번에 저장하는 방법은 무엇입니까?

분류에서Dev

stdin 입력 문자열을 받아 stderr, stdout 및 반환 코드를 반환하는 Python 하위 프로세스와 유사한 호출이 있습니까?

분류에서Dev

stdout 및 stderr을 파일로, stderr을 stdout으로 리디렉션

분류에서Dev

stderr 및 stdout을 동일한 파일로 리디렉션하는 방법

분류에서Dev

Node.js는 stdin에서 읽을 때 Python 하위 프로세스 stdout을 읽을 수 없습니다.

분류에서Dev

파일 및 콘솔에서 stdOut / StdErr 출력이있는 백그라운드 프로세스

분류에서Dev

파일 및 콘솔에서 stdOut / StdErr 출력이있는 백그라운드 프로세스

분류에서Dev

스크립트 stderr 및 stdout을 파일로 리디렉션하지만 stdout도 tty로 유지합니까?

분류에서Dev

stderr haskell을 캡처하는 동안 하위 프로세스와 상호 작용

분류에서Dev

bash 함수를 사용하여 stdin / stdout을 캡처하는 동안 백그라운드로 명령 보내기

분류에서Dev

Python에서 함수에 액세스하고 스레딩 미디어 및 서보 하위 프로세스 중지

분류에서Dev

stdout을 (일시적으로) 캡처하는 방법

분류에서Dev

하위 프로세스 및 Popen을 사용하여 장기 실행 프로세스에서 stdout을 반환하는 방법은 무엇입니까?

분류에서Dev

컴파일 프로세스를 살펴보고 stderr을 사용하여 인수를 사용하는 스크립트에서 컴파일 출력을 캡처합니다.

분류에서Dev

하위 프로세스에서 stdout과 stderr를 모두 얻고 싶습니다.

Related 관련 기사

  1. 1

    변수를 구분하기 위해 프로그램 stdout 및 stderr 캡처

  2. 2

    Python의 하위 프로세스 / Popen에서 stdout을 stderr로 리디렉션

  3. 3

    내 Django 앱에서 Celery의 하위 프로세스 stdout 및 stderr에 액세스

  4. 4

    ssh를 수행하는 동안 stdout 및 stderr 하위 프로세스

  5. 5

    Python 하위 프로세스는 stdout 및 stderr를 억제합니다.

  6. 6

    powershell-stdout 및 stderr를 파일로 캡처하는 동시에 터미널에 보관

  7. 7

    자바 프로세스 : 단일 스레드에서 하위 프로세스의 stdout 및 stderr 읽기

  8. 8

    "3 방향"Python 하위 프로세스 파이프 라인 : stdout 및 stderr를 두 개의 다른 프로세스로 전송 하시겠습니까?

  9. 9

    로컬 파일에서 stdout을 캡처하면서 어떻게 stdout을 다른 프로세스로 파이프 할 수 있습니까?

  10. 10

    Perl이 하위 프로세스의 STDERR 및 STDOUT을 포착합니다.

  11. 11

    Haskell Turtle을 사용하여 프로세스에서 stdout 및 stderr 출력을 캡처하려면 어떻게해야합니까?

  12. 12

    Windows의 Python에서 하위 프로세스의 stdout, stderr을 어떻게 테스트합니까?

  13. 13

    Python 하위 프로세스 및 스트림을 실행하고 stdout 및 stderr도 필터링하는 방법은 무엇입니까?

  14. 14

    콘솔과 파일 모두에 stdout 및 stderr을 표시하고 stderr을 빨간색으로 표시하고 stdout 및 stderr를 생성 할 때 표시합니다.

  15. 15

    stdout 및 stderr을 읽고 하위 프로세스 Popen을 사용하여 한 번에 저장하는 방법은 무엇입니까?

  16. 16

    stdin 입력 문자열을 받아 stderr, stdout 및 반환 코드를 반환하는 Python 하위 프로세스와 유사한 호출이 있습니까?

  17. 17

    stdout 및 stderr을 파일로, stderr을 stdout으로 리디렉션

  18. 18

    stderr 및 stdout을 동일한 파일로 리디렉션하는 방법

  19. 19

    Node.js는 stdin에서 읽을 때 Python 하위 프로세스 stdout을 읽을 수 없습니다.

  20. 20

    파일 및 콘솔에서 stdOut / StdErr 출력이있는 백그라운드 프로세스

  21. 21

    파일 및 콘솔에서 stdOut / StdErr 출력이있는 백그라운드 프로세스

  22. 22

    스크립트 stderr 및 stdout을 파일로 리디렉션하지만 stdout도 tty로 유지합니까?

  23. 23

    stderr haskell을 캡처하는 동안 하위 프로세스와 상호 작용

  24. 24

    bash 함수를 사용하여 stdin / stdout을 캡처하는 동안 백그라운드로 명령 보내기

  25. 25

    Python에서 함수에 액세스하고 스레딩 미디어 및 서보 하위 프로세스 중지

  26. 26

    stdout을 (일시적으로) 캡처하는 방법

  27. 27

    하위 프로세스 및 Popen을 사용하여 장기 실행 프로세스에서 stdout을 반환하는 방법은 무엇입니까?

  28. 28

    컴파일 프로세스를 살펴보고 stderr을 사용하여 인수를 사용하는 스크립트에서 컴파일 출력을 캡처합니다.

  29. 29

    하위 프로세스에서 stdout과 stderr를 모두 얻고 싶습니다.

뜨겁다태그

보관