私はこれに数時間取り組んできましたが、良い解決策を思いつくことができませんでした. ちょっとした背景として、コマンド ラインからクローズド ソースのパスワード クラッキング プログラムを実行していますが、GPU の温度が高くなりすぎると常に一時停止する必要があります。
私はこのプログラムを使って python で他の操作を行っているので、それが私が好む言語です。とにかく、パスワード プログラムは、それがどの程度うまく機能しているか、GPU の温度などを定期的に更新し、いつでも一時停止できるようにします。
温度は問題ありませんが、ブロッキングの問題により、一時停止コマンドを送信できないと思います。少なくとも何もしていません。出力をスレッド化する例をいくつか見てきましたが、スレッド化された入力と出力を問題なく使用する例は見たことがありません。
つまり、現在の POPEN の制約の下ではこれが不可能である可能性があることはわかっていますが、何らかの方向性を示していただければ幸いです。
popen = Popen(command, stdout=PIPE, stdin=PIPE, shell=True)
lines_iterator = iter(popen.stdout.readline, b"")
while 1:
for line in lines_iterator:
cleanLine = line.replace("\n", "")
p = re.compile('[0-9][0-9]c Temp')
m = p.search(cleanLine)
print cleanLine
if m:
temperature = m.group(0)
if int(temperature[:2]) > 80:
overheating = True
print "overheating"
if overheating:
if "[s]tatus [p]ause [r]esume [b]ypass [q]uit" in line:
#It's not doing anything right here, it just continues
print popen.communicate("p")[0]
これが私のコードの要点です。まだハッキーな段階なので、ベスト コーディング プラクティスに従っていない可能性があることはわかっています。