ArcMapのPythonウィンドウでステートメントの実行を手動で中断する方法は?


20

ArcMapのPythonコンソールで長時間実行されているプロセスの実行を中断するにはどうすればよいですか?

たとえば、以下のような長いイテレーションを開始したら、どのように中断しますか?

for i in range(1, 50):
  # some long process which takes over a minute to complete

コンソールウィンドウに入力したコードの実行中に、キーボードの組み合わせを押したり、ボタンなどをクリックして、いつでもプロセスを停止したいです。


1
ブレークとは、強制的に終了させるという意味ですか?
RK

@RK:はい、私は(1)望ましくない出力を見た、(2)間違った処理順序を入力した、(3)その他の理由があるので、いつでも強制的に終了させたいと思います。
アレックスエシルフィー

2
可能なキーボードショートカットを確認してください。Ctrl + Z、Ctrl + C、およびESCはすべて機能しません。目的を達成するには、IDLEまたは別のIDEを使用する必要がある場合があります。
RK

Windowsマシンのlxターミナルでctrl + Zを使用する

@anurag:ご提案ありがとうございますが、それは私が望んでいることではありません。IDEやターミナルを使用せずに、ArcMapのPythonウィンドウ内で実行を停止したいです。端末またはIDEで実行を終了する方法はすでに知っています。
アレックスエシルフィー

回答:


14

ただテストしただけで、ESC 機能しません。ArcGISはしばらくフリーズしてから続行します。ArcGIS Pythonコンソールで実行した後、強制終了する方法はないようです。Pythonプロセスが表示されないため、タスクマネージャーを使用してそれを強制終了することはできません。

強制的に終了したい場合は、ArcGIS Pythonコンソールで実行するのではなく、IDLEのようなIDEを使用することを検討してください。たとえば、IDLEでは、Ctrl+ ZまたはCtrl+ Cを使用して実行を終了できます。


1
ArcGIS Pro Pythonウィンドウでは、ArcGIS 10.Xウィンドウではできない技術的な制限により、実行中にPythonコードを停止できます。
ジェイソンシャイラー

9

これは私が使用する方法です:

  • kill_processx.pyという小さなPythonスクリプトを作成します
  • kill_processxを実行すると、stop_processx.txtという小さなテストファイルが作成されます。
  • メインプログラムのループの上部または下部で、stop_processx.txtが存在するかどうかを確認します。
  • 存在する場合は、必要なクリーンアップルーチンを実行してから、正常に停止します。
  • stop_processx.txtファイルを削除します

kill_processx.pyファイルの例:

import os 
nameof_killfile="stop_processx.txt"

if os.path.exists(nameof_killfile): 
    os.remove(nameof_killfile) 
else:
    killit=open(nameof_killfile,"w") 
    killit.close()

「kill_processx.py」と呼ぶスクリプトは何ですか?
アーロン

1
kill_processスクリプトは、正しいフォルダーに正しい名前の空のtxtファイルを作成します。
mhoran_psprep

投稿にサンプルスクリプトを含めてください。OPの質問にこれがどのように役立つか、より良いアイデアを得ることができますか?
アーロン

@mhoran_psprep:RKが答えを受け入れたのは、それが質問に答えているためです(IDE以外では不可能です)。回避策として+1。今後実装する予定です。
アレックスエシルフィー

4

総当たり戦術を使用して強制的にシャットダウンすることは悪い習慣です。むしろ、@ Aragonが指摘したように、スクリプトにエラー処理を追加して、特定の条件が満たされない場合にコンポーネントを分離したり、スクリプトを停止したりする必要があります。@RKが指摘するように、ArcGISのパイソンコンソールは、複雑なスクリプトを実行するための次の無価値にあると、実際には、簡単な操作のために確保されなければならない-とスティックIDLEpythonwinpyscripterまたは他のIDEのホストのいずれか。質問に関連するディスカッションは次のとおりです。

エラーメッセージを表示せずに早期終了するために、arcpyスクリプトでsys.exit(0)を使用するにはどうすればよいですか?

Pythonスクリプトの終了

Pythonでコマンドまたはプロンプトを停止する方法は?


1
そしてもちろん、PyScripterのようなIDEでは、「for ... range」ステートメントに「ブレークポイント」を追加し、「デバッグモード」でスクリプトを実行するだけで、IDEは自動的に「一時停止」します反復プロセス中にポイントし、すでに処理された結果を検査できるようにします。
ライアンダルトン

2

10.4で作業していますがここに画像の説明を入力してください、スクリプトの実行中に閉じるX をクリックできることがわかりました。ArcMapは、操作をキャンセルするかどうかを尋ねてきます。

ここに画像の説明を入力してください

はいをクリックします。ArcMapは、終了する前に保存するかどうかを尋ねてきます。[キャンセル]をクリックします。スクリプトはキーボード割り込みをスローします。


この一連のアクションをトリガーするには、どの閉じるボタンをクリックしますか?
アレックスエシルフィー

ほとんどの(すべて?)Windowsソフトウェアの右上にあるウィンドウの赤いX。私の答えの小さな写真を見てください。
エミールブランデージ

1

あなたがPythonの方法で解決したい場合は、これを試してください:

import sys
sys.exit()

または使用:

raise SystemExit()

詳細に:

import time
import sys

sTime= time.time()

if time.time() - sTime > 60:
   sys.exit()

私はそれがあなたを助けることを願っています...


いいえ、これはありません、私が欲しいもの。コンソールウィンドウに入力したコードの実行中に、キーボードの組み合わせを押したり、ボタンなどをクリックして、いつでもプロセスを停止したいです。私は承知しsys.exit()ていますが、ループまたは同様の長いプロセスが実行されているときは動作しません。
アレックスエシルフィー

@Upvoters:これは私が探している答えではありません私の質問には答えません。キーボードの組み合わせを押すか、ボタンまたは同様のものをクリックして、ステートメントの実行を中断します(通常は反復)。
アレックスエシルフィー

1

少なくともArcMap 10.4では、これを行うことができます。[結果]ウィンドウが表示されていることを確認します。(「ジオプロセシング」の下に見つからない場合)。コマンドを実行している場合、このウィンドウに表示されます。それを右クリックして、「キャンセル」を押します。



0

IDLEを使用すると、単一の行「pass」を含む「stop.py」というファイルがあります。別の.pyスクリプトの実行中は、このファイルをIDLEで開いたままにしてください。「stop.py」ウィンドウでF5をクリックすると、IDLEがリセットされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.