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ị?


13

Tôi có một tập lệnh công cụ Arcpy cho ArcGIS 10.0 có hai phần chức năng chính. Người dùng có thể chọn có chạy phần thứ hai hay không. Nếu người dùng chọn KHÔNG chạy phần thứ hai, tôi chỉ muốn chạy chức năng dọn dẹp và thoát tập lệnh với sys.exit (0) mà không có thông báo lỗi được đăng lên cửa sổ kết quả công cụ. Có hai luồng chính ở đây trong GIS-SE về việc thoát các tập lệnh arcpy, nhưng các giải pháp trong đó không giải quyết cụ thể thông báo lỗi. Cấu trúc chung của mã như sau:

import sys
##import arcpy

def CleanUp():
    print 'Cleaning up ...\n'

def finish():
    CleanUp()
    print 'Exiting ...'
    sys.exit(0)

do_more = False  #or True ... input from user

#Section 1:  do some stuff
print 'Doing some stuff ...\n'

if not do_more:
    finish()

#Section 2:  do more stuff
print 'doing more stuff ...'
CleanUp()

Nếu tôi chạy mã này trong trình thông dịch Python bên ngoài ArcGIS / arcpy, nó hoạt động như tôi mong đợi, thoát ra một cách duyên dáng mà không có thông báo lỗi; tuy nhiên, trong tập lệnh phức tạp của tôi có cùng cấu trúc này, tập lệnh thoát, nhưng thông báo lỗi SystemExit được đăng lên cửa sổ kết quả của công cụ. Có cách nào để làm cho tập lệnh công cụ arcpy ăn ngoại lệ và chôn thông báo lỗi SystemExit không?


Chỉ cần thực hiện một cú đâm hoang dã ở đây, nhưng bạn có thể "del arcpy" trước khi gọi SystemExit trong tập lệnh của mình không?

@Dan - Tôi nghi ngờ điều đó, nhưng đó là một ý tưởng thú vị ... hmmm ... cái quái gì thế. Tôi sẽ cho nó một vòng xoáy.
celticflute

1
cảm ơn bạn đã đăng ví dụ mã súc tích minh họa rõ ràng logic và bỏ qua phần bổ sung. +1
matt wilkie

Câu trả lời:


8

Câu trả lời ngắn: cố định trong 10.1. Hiện tại, bạn sẽ cần thêm một mức thụt đầu dòng. Điều này có thể khuyến khích một số tái cấu trúc hữu ích cho mã của bạn mặc dù. Bất cứ khi nào bạn nhận được một số lượng lớn các dòng trong một tập lệnh / thường trình, bạn sẽ muốn nghĩ về việc cắt nó thành các phần nhỏ hơn (các hàm, các lớp).

def main():
    <your code>

if __name__ == "__main__":
    try:
        main()
    except SystemExit as err:
        pass

Cảm ơn, Jason. Vâng, tôi nên cắn viên đạn và tái cấu trúc. Thật khó để làm điều đó với khách hàng đang thở dốc trên cổ tôi. Cuộc sống là thế.
celticflute

3

ArcPy gây rối với môi trường Python của bạn . Nói tóm lại, đừng làm hàm sys.exit () hoặc tìm / gọi hàm "dọn dẹp trước khi thoát" của Arcpy trước khi gọi sys.exit ().


2
Cách mà các trình xử lý thực thi của Python sys.exit()là một loại mánh khóe bẩn thỉu - việc gọi exitra một SystemExitngoại lệ và trình thông dịch cấp cao nhất, thường in một dấu vết, sẽ phát hiện loại ngoại lệ và chấm dứt trình thông dịch. Việc nhúng một trình thông dịch Python trong một ứng dụng khác, chẳng hạn như họ các tệp thực thi ArcGIS, đòi hỏi một số lượng mã cụ thể thực thi không cần thiết như thế này.
Jason Scheirer

2

Tôi không biết cách 'chôn' thông báo lỗi SystemExit, nhưng bạn luôn có thể cơ cấu lại mã của mình để tránh gọi sys.exit

import sys
##import arcpy

def DoMoreStuff():
    print 'doing more stuff ...'

def CleanUp():
    print 'Cleaning up ...'

def finish():
    CleanUp()
    print 'Exiting ...'

do_more = False  #or True ... input from user

#Section 1:  do some stuff
print 'Doing some stuff ...'

if do_more:DoMoreStuff()

finish()

Đúng, nhưng hai phần trong kịch bản phức tạp của tôi là khá lớn. Tôi thà không tạo ra một mức độ thụt đầu dòng khác và phải giải quyết các vấn đề phạm vi sẽ xảy ra ... nhưng, vâng, đây sẽ là một giải pháp. Điều thực sự bực bội là thông báo lỗi chỉ xuất hiện khi bạn sử dụng sys.exit trong arcpy. Trong Python thông thường, thông báo không được đăng, vì ngoại lệ SystemExit không được coi là lỗi.
celticflute
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.