0

私の理解でos.popen()は、Python内でパイプを開き、新しいサブプロセスを開始します。os.popen()と組み合わせてforループを実行すると、問題が発生します。CTRL+Cがループから外れているようには見えません。これが私のコードです:

for FILE in os.popen("ls $MY_DIR/"):
    os.system("./processFile " + FILE)

私がしようとするとCTRL+C、Pythonはプログラムを停止し./processFileますが、Pythonプログラム自体は停止しません!

私はグーグルを回っていましたが、正しい答えを見つけることができなかったようです。一部の人々はSIGNALSの使用を推奨しています(私は試しました...それは機能しませんでした)。別の人はPIDを使用して子PIDを殺そうとしましたが、私はそれを取得できなかったようです。

CTRL+C(SIGINT)を使用するときにプログラミングを停止できるように、誰かが私をより良い例に導くことができますか?

4

2 に答える 2

3

私はいくつかの答えが正しく推奨されたsubprocess.check_callを見て、コメントのOPは言った

このエラーが発生します:AttributeError:'module'オブジェクトに属性'check_call'がありません

リンクしたばかりのドキュメントによると、次のようにcheck_callマークされています。

バージョン2.5の新機能。

そのため、OPは事実に言及せずにPythonの古いバージョン(2.4以前)を使用しているように見えます(現在の本番環境対応バージョンは2.7であり、2.4は何年も前のものです)。

したがって、推奨できる最善の方法はアップグレードすることです。2.7があなたの好みにとって「新しすぎる」場合(保守的な「ショップ」で考えられるかもしれません)、2.6の最新のマイクロリリースは少なくとも問題ないはずです-そしてそれはあなたsubprocess.check_callにだけでなく、多くの追加機能も提供します、バグ修正、および最適化!-)

于 2010-07-26T19:53:59.143 に答える
2

動作は正しいです。Ctrl + Cは、親プロセスではなく、フォアグラウンドプロセスを停止します。ここでシェルを呼び出して使用することlsは不適切です。コードは次のように記述する方が適切です(テストされていません)。

import os
import subprocess
for fname in os.listdir(directory):
    path = os.path.join(directory, fname)
    subprocess.check_call(["./processFile", path])
于 2010-07-26T19:13:38.503 に答える