2009-08-11 3 views
2

이 파일을 eclipseEclipse + Pydev : "정지"를 누르면 "정리"기능이 호출되지 않습니까?

class Try: 
    def __init__(self): 
     pass 
    def __del__(self): 
     print 1 
a=Try() 
raw_input('waiting to finish') 

에서 실행하려고 시도하고 프로그램이 끝나지 않고 중지 버튼을 누르면 "1"이 인쇄되지 않습니다. 즉, del 메소드가 호출되지 않습니다. 쉘에서 스크립트를 실행하려고하면 ctrl-c \ sys.exit "1"이 인쇄됩니다. 즉 del이 호출됩니다. wait()를 사용하면 똑같은 문제가 발생합니다.

class A: 

    def __enter__(self): 
     return None 
    def __exit__(self, type, value, traceback): 
     print 3 


with A(): 
    print 1 
    raw_input('Waiting') 
    print 2 

메시지가 표시 될 때 "중지"를 누르면 "3"이 인쇄되지 않습니다.

왜 그럴까요? 주위에 방법이 있습니까?

고마워요, 노엄

답변

2

누르면 정지가 크게 인터프리터를 죽이고 사용합니다. kill/taskkill을 사용하는 것처럼 프로세스가 종료되는 것을 인식하지 못합니다. 중단 명령과 위키 백과에서

Ctrl+C 조각 ...

제어-C는 가 UNIX에 의해 대중화 및 다른 시스템에 채택되었다. POSIX 시스템에서 시퀀스는 활성 프로그램이 에 SIGINT 신호를 수신하게합니다. 프로그램이 을 처리하는 방법을 지정하지 않으면이 조건이 종료됩니다. 일반적으로 SIGINT를 처리하는 프로그램은 여전히 ​​ 자체를 종료하거나 실행중인 작업을 종료합니다.

Ctrl+C은 프로그램을 중단하는 제어 신호이지만 해당 단락의 중간에 눈치 챘을 수도 있으므로 프로그램에서 신호 처리 방법을 지정할 수 있습니다. 파이썬에서는 Ctrl + C throws a KeyboardInterrupt exception이 정상적으로 포착 된 다음 파이썬은 정상적으로 종료됩니다. Ctrl+C으로 통역사를 살해하더라도 처리하기 전에 환경을 정리할 수 있습니다.

"주변에 방법이 있습니까?""

당신은 내가 주위를 둘러 보았다. 당신은 EOF를 보낼 Ctrl+Z을 사용할 수, raw_input(...) 호출에 중지하고자, 불행히도 Eclipse에서 Ctrl+C/ 0x03를 보낼 수있는 방법은없는 것 같다 경우.

+0

고마워,하지만 내 질문에 대답하지 않은 것 같아요 - 셸에서 실행할 때 * ctrl-c와 * 인터프리터 *를 중지 여전히 __del__를 호출하지만 일어날 일식에서 중지 할 때. 나는 차이점을 일으키는 것이 궁금한 해결책을 찾지 못했습니다. – olamundo

+0

조금 벗어났습니다. 또는 적어도 잘못 설명되었으므로 좀 더 정리하고 더 많은 정보를 추가했습니다. – Zwergner

+0

OK, 감사합니다 - 당신의 대답은 계속됩니다. 나는 처음에는 그것을 이해하지 못했습니다. 죄송합니다 – olamundo

4

파이썬 문서 : 인스턴스가 파기 될 때

__del__(self) 

가 호출됩니다. 이것은 소멸자라고도합니다. 기본 클래스에 __del__() 메서드가있는 경우 파생 클래스의 __del__() 메서드 (있는 경우)를 명시 적으로 호출하여 인스턴스의 기본 클래스 부분을 올바르게 삭제해야합니다. __del__() 메서드에서 새 참조를 작성하여 인스턴스 삭제를 연기하는 것이 가능하지만 (권장하지는 않지만!) 가능합니다. 이 새로운 참조가 삭제되면 나중에 호출 할 수 있습니다. __del__() 메서드가 인터프리터가 끝날 때 여전히 존재하는 개체에 대해 호출된다는 보장은 없습니다. (실제로 상당히 자주 실패하지만)

당신이 메서드를 호출 보장하려면 이클립스에서 with-statement

+0

을 어쩌면 내가 ' 내가 뭔가를 놓친,하지만 내 경우에 대한 옳은이 확실하지 않습니다 : 클래스 B의 인스턴스를 보유하고, B는 종료 할 때 명시 적으로 해제해야합니다 일부 외부 리소스를 보유하고 있습니다. 어떻게 해결할 수 있습니다 이 문제는? with A와 B 둘 다 close()라는 명시 적 메소드를 만든다. – olamundo

+0

또한 wait()는 eclipse에서 delete보다 좋지 않다. - stop을 눌러 보자. 그러면 __exit__이 호출되지 않는다는 것을 알 수있다. ... – olamundo

관련 문제