2017-12-01 6 views
1

I는 다음과 같습니다 Windows에서 파이썬 3에서 일부 코드를 쓰고 있어요 : python foo.py와 콘솔에서 직접 실행하는 경우정지 KeyboardInterrupt에 도달 배치 파일 프로세서

try: 
    do something that takes a long time 
    (training a neural network in TensorFlow, as it happens) 
except KeyboardInterrupt: 
    print('^C') 
print a summary of results 
still useful even if the training was cut short early 

이 완벽하게 작동합니다.

그러나 파이썬 호출이 배치 파일 내에있는 경우 위의 모든 작업을 수행하지만 '일괄 처리 작업 종료'프롬프트를 사용하여 콘솔을 스팸으로 처리합니다.

그런 일을 막을 방법이 있습니까? 파이썬에서^C를 완전히 먹어서 배치 파일이나 그 밖의 다른 방법으로 뛰어 넘는가?

+1

파이썬에서 제어 할 수 없습니다. 콘솔 호스트 (conhost.exe)에 연결된 모든 프로세스는 세션 서버 (csrss.exe)에 의해 생성 된 새 스레드에서 콘솔 제어 이벤트를 수신합니다. CMD의 처리기가 플래그를 설정합니다. 파이썬이 종료 된 후 디스패치 루프를 다시 시작하면 Ctrl + C 플래그가 설정되어 "배치 작업 종료"메시지가 인쇄됩니다. – eryksun

답변

1

사용 CTRL + C 파일

EDIT 정지 해제됩니다 배치 파일에서 break (More info here) 명령 : break 명령의 this site의 Windows

최신 버전에 따르면을 (Windows ME, Windows 2000, Windows XP 이상)은 이전 버전과의 호환성을 위해서만이 명령을 포함하고 중단을 돌리는 것은 효과가 없습니다.

나는 개인적으로 내가 해결 방법을 찾을 때 편집 것,이 테스트하고 확인할 수 있습니다

편집 # 2 : 당신은 비록 start "" /b /wait cmd /c "yourfile.bat"를 실행하는 두 번째 배치 스크립트, 이것은로 알려져있을 수 있다면 다른 중첩 된 배치 파일로 인해 글리치가 발생합니다.

Ctrl + C를 비활성화하는 플래그는 하위 프로세스에 상속되므로 Python은 더 이상 KeyboardInterrupt를 발생시키지 않습니다. 게다가 콘솔에서 읽는 것이 CRT에서 SIGINT를 얻지 않고 Ctrl + C로 중단되면 Python에서 여전히 버그가 있습니다. Python 스크립트는 ctypes를 통해 Ctrl + C를 수동으로 활성화해야합니다. import ctypes를 사용하십시오. kernel32 = ctypes.WinDLL ('kernel32', use_last_error = True); 성공 = kernel32.SetConsoleCtrlHandler (없음, 거짓) (코멘트에서) Eryksyn에 의해 지적 3, 당신은 수 있도록 cytpes에 사용할 수 있습니다

편집 # 그;

import ctypes; 
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True); success = kernel32.SetConsoleCtrlHandler(None, False) 

편집 # 4 : 나는 그것을 찾은 것 같아요는 (이 작동하지 않을 수 있지만)이 당신이 threading 가져 오기를 사용할 수하려고?

import time 
from threading import Thread 

def noInterrupt(): 
    for i in xrange(4): 
     print i 
     time.sleep(1) 

a = Thread(target=noInterrupt) 
a.start() 
a.join() 
print "done" 
+0

CMD의'start' 명령은'CREATE_NEW_PROCESS_GROUP' 프로세스 생성 플래그를 사용합니다. 이것은'CTRL_C_EVENT'가 기본적으로 무시되도록합니다. 그러나 여전히'CTRL_BREAK_EVENT'에 대한 종료 요청을 볼 수 있습니다. – eryksun

+0

Ctrl + C를 비활성화하는 플래그는 하위 프로세스에 상속되므로 Python은 더 이상 'KeyboardInterrupt'를 발생시키지 않습니다. 게다가 콘솔에서 읽을 때 CRT에서'SIGINT '를 얻지 않고 Ctrl + C *로 인터럽트를하면 파이썬에서 여전히 버그가 있습니다. Python 스크립트는 ctypes를 통해 Ctrl + C를 수동으로 활성화해야합니다. 'import ctypes;''kernel32 = ctypes '를 사용하십시오.WinDLL ('kernel32', use_last_error = True);'성공 = kernel32.SetConsoleCtrlHandler (없음, 거짓)'. – eryksun

+0

ctypes는 * disable *이 아닌 * Python에서 * Ctrl + C를 사용 가능하게하는 데 사용됩니다. 이것은 콘솔에 연결된 다른 모든 프로세스에 영향을 미치지 않습니다. 배치 스크립트를 실행하는 상위 CMD 쉘에서 Ctrl + C가 여전히 비활성화됩니다. 그러나 파이썬에 의해 생성 된 프로세스는 활성화 된 상태에서 Ctrl + C를 상속합니다. – eryksun