Làm cách nào để ngắt thực thi câu lệnh trong cửa sổ Python của ArcMap?


20

Làm thế nào để phá vỡ việc thực thi một quy trình dài trong bảng điều khiển python của ArcMap?

Ví dụ, làm thế nào để bạn phá vỡ một vòng lặp dài như dưới đây một khi nó được bắt đầu?

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

Tôi muốn dừng quá trình bất cứ lúc nào tôi muốn bằng cách nhấn tổ hợp bàn phím, nhấp vào nút hoặc một cái gì đó tương tự trong khi mã tôi có đầu vào trong cửa sổ giao diện điều khiển đang chạy .


1
Bằng cách phá vỡ, bạn có nghĩa là bạn có nghĩa là buộc nó phải bỏ?
RK

@RK: Có, tôi muốn buộc nó thoát bất cứ lúc nào tôi muốn, bởi vì tôi đã (1) thấy một đầu ra không mong muốn, (2) đã nhập sai thứ tự xử lý, (3) bất kỳ lý do nào khác.
Alex Essilfie

2
Chỉ cần kiểm tra các phím tắt có thể. Ctrl + Z, Ctrl + C và ESC đều không hoạt động. Bạn có thể cần sử dụng IDLE hoặc IDE khác để thực hiện những gì bạn muốn.
RK

sử dụng ctrl + Z trong thiết bị đầu cuối lx cho máy windows

@anurag: Cảm ơn bạn đã gợi ý nhưng đó không phải là điều tôi mong muốn. Điều tôi muốn là dừng việc thực thi bên trong cửa sổ Python trong ArcMap, không sử dụng IDE hay Terminal. Tôi đã biết làm thế nào để chấm dứt thực thi trong một thiết bị đầu cuối hoặc IDE.
Alex Essilfie

Câu trả lời:


14

Chỉ cần thử nghiệm và ESC cũng không hoạt động. ArcGIS chỉ đóng băng trong giây lát và sau đó tiếp tục. Dường như không có cách nào để buộc nó thoát khỏi nó khi nó chạy trong bảng điều khiển ArcGIS Python. Bạn không thể giết nó bằng Trình quản lý tác vụ vì quá trình Python không hiển thị ở đó.

Nếu bạn thực sự muốn có thể buộc thoát nó, bạn có thể muốn xem xét sử dụng IDE như IDLE thay vì thực hiện trong bảng điều khiển ArcGIS Python. Trong IDLE chẳng hạn, bạn có thể sử dụng Ctrl+ Zhoặc Ctrl+ Cđể chấm dứt thực thi.


1
Cửa sổ ArcGIS Pro Python cho phép bạn dừng mã Python trong khi thực thi, do giới hạn công nghệ, cửa sổ ArcGIS 10.X không thể.
Jason Scheirer 6/03/2015

9

Đây là phương pháp tôi sử dụng:

  • tạo một tập lệnh python nhỏ có tên kill_ processx.py
  • Khi chạy kill_ processx tạo một tệp thử nghiệm nhỏ gọi là stop_ processx.txt.
  • Ở đầu hoặc cuối của vòng lặp trong chương trình chính, hãy kiểm tra xem stop_ processx.txt có tồn tại không.
  • Nếu nó tồn tại, thực hiện bất kỳ thói quen dọn dẹp nào bạn cần, sau đó dừng lại một cách duyên dáng.
  • Xóa tệp stop_ processx.txt

ví dụ về tệp 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()

Kịch bản bạn gọi là "kill_ processx.py" là gì?
Aaron

1
tập lệnh kill_ process chỉ tạo một tệp txt trống với tên chính xác trong thư mục chính xác.
mhoran_psprep

Bạn có thể vui lòng bao gồm một tập lệnh mẫu trong bài đăng của mình để chúng tôi có thể hiểu rõ hơn về cách điều này có thể giúp với câu hỏi của OP không?
Aaron

@mhoran_psprep: Tôi đã chấp nhận câu trả lời của RK vì nó trả lời câu hỏi (không thể thực hiện được trừ khi trong IDE). +1 cho cách giải quyết của bạn. Tôi đoán tôi sẽ thực hiện nó trong tương lai.
Alex Essilfie

4

Đó là thực tế xấu để buộc phải tắt máy bằng chiến thuật vũ phu. Thay vào đó, như @Aragon chỉ ra, bạn nên thêm xử lý lỗi vào tập lệnh của mình để cô lập các thành phần và / hoặc dừng tập lệnh nếu không đáp ứng một số điều kiện nhất định. Như @RK chỉ ra, bảng điều khiển python ArcGIS bên cạnh vô dụng để chạy các tập lệnh phức tạp và, trong thực tế, nên được dành riêng cho các hoạt động đơn giản - gắn bó với IDLE , pythonwin , pyscripter hoặc bất kỳ máy chủ IDE nào khác. Dưới đây là các cuộc thảo luận liên quan đến câu hỏi của bạn:

Làm cách nào để sử dụng sys.exit (0) trong tập lệnh arcpy để thoát sớm mà không có thông báo lỗi hiển thị?

Chấm dứt tập lệnh Python

Làm thế nào để dừng một lệnh hoặc dấu nhắc trong Python?


1
Và tất nhiên, với một IDE như PyScripter, bạn chỉ cần thêm "điểm dừng" vào câu lệnh "for ... phạm vi" của mình, chạy tập lệnh trong "chế độ gỡ lỗi" và IDE sẽ tự động "tạm dừng" cùng một lúc điểm trong quá trình lặp và cho phép bạn kiểm tra các kết quả đã được xử lý.
RyanDalton

2

Tôi đang làm việc trong 10,4 và tôi thấy rằng tôi có thể nhấp vào đóng X nhập mô tả hình ảnh ở đâytrong khi tập lệnh đang chạy. ArcMap sẽ hỏi tôi nếu tôi muốn hủy một hoạt động.

nhập mô tả hình ảnh ở đây

Tôi bấm Có. ArcMap sau đó hỏi tôi có muốn lưu trước khi thoát không. Tôi bấm Hủy bỏ. Kịch bản ném một ngắt bàn phím.


Bạn đóng nút nào để kích hoạt chuỗi hành động này?
Alex Essilfie

Các cửa sổ X màu đỏ ở phía trên bên phải của hầu hết (tất cả?) Phần mềm windows. Xem pic nhỏ trong câu trả lời của tôi.
Emil Brundage

1

Nếu bạn muốn giải theo cách pythonic, hãy thử điều này:

import sys
sys.exit()

hoặc dùng:

raise SystemExit()

chi tiết:

import time
import sys

sTime= time.time()

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

Tôi hy vọng nó sẽ giúp bạn...


Không, đây không phải là điều tôi muốn. Tôi muốn dừng quá trình bất cứ lúc nào tôi muốn bằng cách nhấn tổ hợp bàn phím, nhấp vào nút hoặc một cái gì đó tương tự trong khi mã tôi có đầu vào trong cửa sổ giao diện điều khiển đang chạy . Tôi biết sys.exit()nhưng điều đó không hiệu quả khi một vòng lặp hoặc một quá trình dài tương tự đang chạy.
Alex Essilfie

@Upvoters: đây không phải là câu trả lời tôi đang tìm kiếm. Nó không trả lời câu hỏi của tôi . Tôi muốn phá vỡ việc thực hiện một câu lệnh (thường là lặp lại) bằng cách nhấn tổ hợp bàn phím hoặc nhấp vào nút hoặc một cái gì đó tương tự.
Alex Essilfie

1

Ít nhất trong ArcMap 10.4, bạn có thể làm điều này. Đảm bảo cửa sổ "Kết quả" hiển thị. (Nếu không tìm thấy nó trong "Geoprocessing"). Bây giờ nếu bạn có một lệnh đang chạy, nó sẽ hiển thị trong cửa sổ này. Nhấp chuột phải vào nó và nhấn "hủy".



0

Sử dụng IDLE, tôi có một tệp có tên là "stop.py" chứa một dòng duy nhất: "vượt qua". Giữ tệp này mở trong IDLE trong khi tập lệnh .py khác đang chạy. Nhấp vào F5 trong cửa sổ "stop.py" đặt lại IDLE.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.