6

この質問にはすでに答えがあります。

私は、さまざまなLinuxプロセスをチェックし、そのうちの1つを見つけて、特定のメッセージ(サービス名を参照するという意味で「特定」)をログに記録する簡単なスクリプトを持っています。

私の質問:多条件関数にブール値を返させるための適切な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そして、Pythonができることのために外部ユーティリティを使うこと(grepそしてwcしかし、それはあなたが質問していることとは別のものです。 - ShadowRanger
  • あなたのコメントに感謝します(特にあなたのもの、@ ShadowRanger - 私は最低限シェルプロセスを使い、それから大部分の作業にはPythonを使います)。 - ABach

2 답변


5

Pythonの空の文字列は "falsey"なので、返すのはやや冗長です(False、 '')。私は代わりにこれをするかもしれません:

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真理値テスト


  • 戻り値のテストはpythonicではなくCっぽいので、例外的な解決策を好むのはそのためです。 - Gribouillis
  • ご回答有難うございます! "虚偽"について忘れていました。空の文字列 - ABach
  • @Gribouillisからの回答は、私が書き始めたときにはありませんでした。私は彼の方がより熱心であることに同意します - それは「許しではなく、許しを求める」の下にポイントを獲得します。少なくとも。 - Joe Carey

3

私はこれもpythonicになると思います(でもそれは私だけのことかもしれません)

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

リンクされた質問


関連する質問

最近の質問