6

이 질문에는 이미 답변이 있습니다.

나는 여러 리눅스 프로세스를 점검하고, 그 중 하나를 찾는 간단한 메시지를 가지고있다. 특별한 메시지 (서비스의 이름을 언급하는 측면에서 "특별한")를 기록한다.

내 질문 : 다중 조건부 함수를 가질 적절한, Pythonic 방법은 무엇입니까 부울 반환합니다.문자열 (인쇄 된 메시지 용)?

다음은 현재 솔루션의 필 다운 버전입니다 (튜플 사용).

import subprocess
import time

def _isProcessRunning(cmd):
    return int(
            subprocess.check_output(
                '{} | grep -v grep | wc -l'.format(cmd),
                shell=True
                )
            ) > 0

def processGroupFound():
    if _isProcessRunning('ps auwxx | grep duplicity'):
        return (True, 'Duplicity')
    elif _isProcessRunning('who | grep pts'):
        return (True, 'SSH')
    elif _isProcessRunning('netstat -na | grep ESTA | grep 5901'):
        return (True, 'VNC')
    else:
        return (False, '')

def worker():
    while True:
        process_found, service_string = processGroupFound()
        if process_found:
            print('{} found; skipping'.format(service_string))
        else:
            print('Continuing on')
        time.sleep(10)


if __name__ == "__main__":
    worker()

이 방법은 제대로 작동하지만 걱정하지 마라. (특히 스타일 론적으로, 그러나이 간단한 샘플에서 잘못된 로직을 수집한다면, 거기에 대해 아무 말없이 자유롭게 의견을 말하면 도움이된다.


  • 이건 괜찮아. 완벽하게 관용적. 나는 괄호를 생략 할 수도있다.return True, 'Duplicity'), 그러나 다시는 어떤 경우에는 그렇지 않을 수도 있습니다. - Mad Physicist
  • 다른 옵션도 많이 있습니다.stackoverflow.com/questions/354883/… - Alex G Rice
  • 괄호를 사용하여return진술,하지만 그렇지 않으면, 괜찮아 보인다. 나는 항상 의심 스럽다.shell=True, 파이썬이 할 수있는 것들을 외부 유틸리티를 사용하여grepwc작업),하지만 당신이 묻는 것과는 별개입니다. - ShadowRanger
  • 고마워, 여러분의 의견에 대해 (특히 여러분, @ShadowRanger - 쉘 프로세스를 최소한으로 사용하고 파이썬을 대량으로 사용하려고합니다). - ABach

2 답변


5

파이썬에서 빈 문자열은 "거짓"이므로 반환하는 것이 다소 불필요합니다 (거짓, ''). 대신이 작업을 수행 할 수 있습니다.

def processGroupFound():
    if _isProcessRunning('ps auwxx | grep duplicity'):
        return 'Duplicity'
    elif _isProcessRunning('who | grep pts'):
        return 'SSH'
    elif _isProcessRunning('netstat -na | grep ESTA | grep 5901'):
        return 'VNC'
    else:
        return ''

def worker():
    while True:
        service_string = processGroupFound()
        if service_string:
            print('{} found; skipping'.format(service_string))
        else:
            print('Continuing on')
        time.sleep(10)

(만나다4.1 진실 가치 시험)


  • 반환 값을 테스트하는 것은 파이썬 대신 C-ish이므로 예외 솔루션을 선호하는 이유입니다. - Gribouillis
  • 귀하의 답변 주셔서 감사합니다! 나는 "거짓된 것"에 대해 잊어 버렸습니다. 빈 문자열의. - ABach
  • @Gribouillis가 내게 글을 쓰기 시작했을 때의 대답은 없었습니다. 나는 그의 것이 더 파이썬적임에 동의한다 - 그것은 "용서를 요청한다. 적어도. - Joe Carey

3

나는 이것이 파이썬이라고 생각한다. (그러나 그것은 나일지도 모른다.)

class NoRunningService(RuntimeError): pass

def findService():
    if _isProcessRunning('ps auwxx | grep duplicity'):
        return 'Duplicity'
    elif _isProcessRunning('who | grep pts'):
        return 'SSH'
    elif _isProcessRunning('netstat -na | grep ESTA | grep 5901'):
        return 'VNC'
    else:
        raise NoRunningService

def worker():
    while True:
        try:
            service_string = findService()
        except NoRunningService:
            print('Continuing on')
        else:
            print('{} found; skipping'.format(service_string))
        time.sleep(10)


  • 정말 고마워. 심리적으로, 나는 "예외"라는 생각에 씨름한다. 보정을 필요로하는 치명적 오류 "라고 판단한다. 나는 그것에 대해 연구 할 것이다. ;) - ABach
  • 그것은 그 이상입니다. 함수가 케이스를 처리하지 않으면 예외가 발생합니다! - Gribouillis

연결된 질문


관련된 질문

최근 질문