2010-01-20 84 views
6

Hey all, Tôi có một kịch bản mà chạy như mộtThoát khỏi một chương trình bằng Python?

while True: 
    doStuff() 

cách tốt nhất để giao tiếp với kịch bản này là gì nếu tôi cần phải ngăn chặn nó nhưng tôi không muốn giết nó nếu nó đang ở trong giữa một hoạt động?

Cảm ơn!

Trả lời

7

Cách tốt nhất là viết lại tập lệnh để nó không sử dụng while True:.

Đáng buồn thay, không thể phỏng đoán một cách tốt để chấm dứt điều này.

Bạn có thể sử dụng tín hiệu Linux.

Bạn có thể sử dụng bộ hẹn giờ và dừng sau một lúc.

Bạn có thể có dostuff trả lại giá trị và dừng nếu giá trị là False.

Bạn có thể kiểm tra tệp cục bộ và dừng nếu tệp tồn tại.

Bạn có thể kiểm tra trang FTP cho tệp từ xa và dừng tệp tồn tại.

Bạn có thể kiểm tra trang web HTTP để biết thông tin cho biết liệu vòng lặp của bạn có nên dừng hay không.

Bạn có thể sử dụng những thứ dành riêng cho hệ điều hành như semaphores hoặc bộ nhớ dùng chung.

+0

cảm ơn câu trả lời nhanh, chắc chắn là một số ý tưởng hay ở đó mà tôi không nghĩ đến. – James

5

Tôi nghĩ rằng thanh lịch nhất sẽ là:

keep_running = true 
while keep_running: 
    dostufF() 

và sau đó có thể thiết lập dostuff()keep_running = false bất cứ khi nào trong không còn muốn tiếp tục chạy, sau đó trong khi vòng lặp kết thúc, và tất cả mọi thứ dọn dẹp độc đáo.

2

Nếu đó là một ứng dụng điều khiển và thoát bằng cách nhấn Ctrl + C là ok, điều đó có thể giải quyết được sự cố của bạn không?

try: 
    while True: 
    doStuff() 
except KeyboardInterrupt: 
    doOtherStuff() 

Tôi đoán vấn đề với cách tiếp cận đó là bạn sẽ không có quyền kiểm soát chính xác thời gian và địa điểm trong doStuff việc thực thi bị chấm dứt.

7

Và tôi giả sử bạn có nghĩa là giết từ bên ngoài tập lệnh python.

Con đường tôi đã tìm thấy dễ nhất là

@atexit.register 
def cleanup() 
    sys.unlink("myfile.%d" % os.getpid()) 

f = open("myfile.%d" % os.getpid(), "w") 
f.write("Nothing") 
f.close() 
while os.path.exists("myfile.%d" % os.getpid()): 
    doSomething() 

Sau đó, để chấm dứt kịch bản chỉ cần loại bỏ các myfile.xxx và ứng dụng nên bỏ thuốc lá cho bạn. Bạn có thể sử dụng điều này ngay cả với nhiều phiên bản của cùng một tập lệnh đang chạy cùng một lúc nếu bạn chỉ cần tắt một tập lệnh. Và nó cố gắng tự dọn dẹp sau chính nó ....

-1

Mô-đun tín hiệu có thể bẫy tín hiệu và phản ứng tương ứng?

Các vấn đề liên quan