この質問にはすでに答えがあります。
私は、さまざまな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()
これはうまくいきますが、私はそれを正しくすることを気にかけています(特に、このスタイルのサンプルで誤ったロジックを収集した場合は、ここでもコメントしてください。ご協力ください)。
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になると思います(でもそれは私だけのことかもしれません)
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)
return True, 'Duplicity'
しかし、それから私はいくつかのケースではないかもしれません。 - Mad Physicistreturn
ステートメントは、そうでなければ、大丈夫だ。私はいつも疑っていますshell=True
そして、Pythonができることのために外部ユーティリティを使うこと(grep
そしてwc
しかし、それはあなたが質問していることとは別のものです。 - ShadowRanger