実行可能ファイルが実行されているように見えるかどうかをテストするために使用される小さな関数があります。コマンドps -A
とsubprocess
モジュールを使用してブール値を返します。
def running(program):
results = subprocess.Popen(
["ps", "-A"],
stdout = subprocess.PIPE
).communicate()[0].split("\n")
matches = [
line for line in results if program in line and "defunct" not in line
]
if matches:
return True
else:
return False
Python 2では正常に動作しますが、Python 3で使用しようとすると、次のエラーが発生します。
TypeError: a bytes-like object is required, not 'str'
この関数をPython2と3の両方で機能するようにきちんと変更する方法は私にはわかりません。ガイダンスを歓迎します。
問題は、communicate()がバイト文字列を返し、program(i suppose)が文字列として渡される 'if program inline'を実行しようとしていることだと思います。文字列をバイト文字列に変換してみることができますif program.encode() in line and "defunct".encode() not in line
編集
'universal_newlines = True'をPopenに渡して、ストリームをテキストモードで開き、文字列を返すこともできますhttps://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate https ://docs.python.org/3/library/subprocess.html#subprocess.Popen.stdout
Python2とPython3の両方で機能します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加