Bagaimana cara memutus eksekusi pernyataan secara manual di jendela Python ArcMap?

20

Bagaimana cara seseorang mematahkan eksekusi proses yang sudah berjalan lama di konsol python ArcMap?

Misalnya, bagaimana Anda mematahkan iterasi yang panjang seperti yang di bawah ini setelah dimulai?

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

Saya ingin menghentikan proses kapan saja saya mau dengan menekan kombinasi keyboard, mengklik tombol atau sesuatu yang serupa ketika kode yang saya input di jendela konsol sedang berjalan .

Alex Essilfie
sumber
1
Maksud Anda maksud Anda memaksanya untuk berhenti?
RK
@RK: Ya, saya ingin memaksanya untuk berhenti kapan saja saya mau, karena saya telah (1) melihat output yang tidak diinginkan, (2) telah memasukkan urutan pemrosesan yang salah, (3) alasan lain.
Alex Essilfie
2
Baru saja memeriksa pintasan keyboard yang mungkin. Ctrl + Z, Ctrl + C dan ESC semuanya tidak berfungsi. Anda mungkin perlu menggunakan IDLE atau IDE lain untuk mencapai apa yang Anda inginkan.
RK
gunakan ctrl + Z di terminal lx untuk mesin windows
@anurag: Terima kasih atas saran Anda tetapi bukan itu yang saya inginkan. Yang saya inginkan adalah menghentikan eksekusi di dalam jendela Python di ArcMap, tidak menggunakan IDE atau Terminal. Saya sudah tahu cara menghentikan eksekusi di terminal atau IDE.
Alex Essilfie

Jawaban:

14

Hanya mengujinya dan ESC tidak berhasil. ArcGIS membeku sesaat dan kemudian melanjutkan. Sepertinya tidak ada cara untuk melakukan paksa berhenti setelah dijalankan di konsol ArcGIS Python. Anda tidak dapat membunuhnya menggunakan Task Manager karena proses Python tidak muncul di sana.

Jika Anda benar-benar ingin dapat menghentikannya secara paksa, Anda mungkin ingin mempertimbangkan untuk menggunakan IDE seperti IDLE daripada melakukannya di konsol ArcGIS Python. Di IDLE misalnya, Anda dapat menggunakan Ctrl+ Zatau Ctrl+ Cuntuk mengakhiri eksekusi.

RK
sumber
1
Jendela ArcGIS Pro Python memungkinkan Anda menghentikan kode Python ketika sedang dijalankan, karena keterbatasan teknologi, jendela ArcGIS 10.X tidak bisa.
Jason Scheirer
9

Ini adalah metode yang saya gunakan:

  • buat skrip python kecil yang disebut kill_processx.py
  • Ketika menjalankan kill_processx membuat file uji kecil yang disebut stop_processx.txt.
  • Di bagian atas atau bawah dari loop dalam program utama, periksa apakah ada stop_processx.txt.
  • Jika memang ada, jalankan rutinitas pembersihan apa pun yang Anda butuhkan, kemudian berhenti dengan anggun.
  • Hapus file stop_processx.txt

contoh file 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()
mhoran_psprep
sumber
Apa skrip yang Anda sebut "kill_processx.py"?
Aaron
1
skrip kill_process hanya membuat file txt kosong dengan nama yang benar di folder yang benar.
mhoran_psprep
Bisakah Anda memasukkan contoh skrip ke dalam posting Anda, sehingga kami bisa mendapatkan ide yang lebih baik tentang bagaimana ini dapat membantu dengan pertanyaan OP?
Aaron
@ mhoran_psprep: Saya telah menerima jawaban RK karena menjawab pertanyaan (tidak mungkin kecuali dalam IDE). +1 untuk solusi Anda. Saya kira saya akan menerapkannya di masa depan.
Alex Essilfie
4

Ini adalah praktik yang buruk untuk memaksa shutdown menggunakan taktik brute force. Sebaliknya, seperti yang ditunjukkan @Aragon, Anda harus menambahkan penanganan kesalahan pada skrip Anda untuk mengisolasi komponen dan / atau menghentikan skrip jika kondisi tertentu tidak terpenuhi. Seperti yang ditunjukkan oleh @RK, konsol python ArcGIS berada di samping tidak berharga untuk menjalankan skrip yang kompleks dan, dalam praktiknya, harus disediakan untuk operasi sederhana - tetap dengan IDLE , pythonwin , pyscripter atau sejumlah host IDE lainnya. Berikut adalah diskusi yang terkait dengan pertanyaan Anda:

Bagaimana cara menggunakan sys.exit (0) dalam skrip arcpy untuk keluar lebih awal tanpa menampilkan pesan kesalahan?

Mengakhiri skrip Python

Bagaimana cara menghentikan perintah atau prompt dengan Python?

Harun
sumber
1
Dan tentu saja, dengan IDE seperti PyScripter, Anda bisa menambahkan "break point" pada pernyataan "for ... range" Anda, jalankan skrip dalam "mode debug", dan IDE akan secara otomatis "berhenti" pada saat yang sama titik selama proses berulang dan memungkinkan Anda untuk memeriksa hasil yang sudah diproses.
RyanKDalton-OffTheGridMaps
2

Saya bekerja di 10.4, dan saya telah menemukan bahwa saya dapat mengklik tutup X masukkan deskripsi gambar di sinisaat skrip sedang berjalan. ArcMap akan bertanya apakah saya ingin membatalkan operasi.

masukkan deskripsi gambar di sini

Saya klik Ya. ArcMap kemudian bertanya kepada saya apakah saya ingin menyimpan sebelum keluar. Saya klik Batal. Skrip melempar interupsi keyboard.

Emil Brundage
sumber
Tombol tutup mana yang Anda klik untuk memicu urutan tindakan ini?
Alex Essilfie
Jendela merah X di kanan atas sebagian besar (semua?) Perangkat lunak windows. Lihat gambar kecil di jawaban saya.
Emil Brundage
1

jika Anda ingin menyelesaikan dengan cara pythonic, coba ini:

import sys
sys.exit()

atau gunakan:

raise SystemExit()

secara terperinci:

import time
import sys

sTime= time.time()

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

Saya harap ini membantu Anda ...

Aragon
sumber
Tidak, ini bukan yang saya inginkan. Saya ingin menghentikan proses kapan saja saya mau dengan menekan kombinasi keyboard, mengklik tombol atau sesuatu yang serupa ketika kode yang saya input di jendela konsol sedang berjalan . Saya sadar sys.exit()tetapi itu tidak berhasil ketika loop atau proses yang sama panjangnya berjalan.
Alex Essilfie
@ Pemasok: ini bukan jawaban yang saya cari. Itu tidak menjawab pertanyaan saya . Saya ingin menghentikan eksekusi pernyataan (biasanya iterasi) dengan menekan kombinasi keyboard atau mengklik tombol atau yang serupa.
Alex Essilfie
1

Paling tidak di ArcMap 10.4, Anda bisa melakukan ini. Pastikan jendela "Hasil" terlihat. (Jika tidak menemukannya di "Geoprocessing"). Sekarang jika Anda memiliki perintah yang sedang berjalan itu akan muncul di jendela ini. Klik kanan padanya dan tekan "batal".

H. Burham
sumber
0

Menggunakan IDLE, saya memiliki file bernama "stop.py" yang berisi baris tunggal: "pass". Biarkan file ini terbuka di IDLE saat skrip .py lain berjalan. Mengklik F5 di jendela "stop.py" me-reset IDLE.

nbcaldon
sumber