2014-10-15 5 views
-1

파이썬을 사용하여 많은 .mp4 파일 모음에 비디오 처리 프로그램을 실행했습니다. 비디오 처리 프로그램 (내가 쓰지 않았고 변경할 수 없음)은 비디오의 마지막 프레임에 도달하면 종료되지 않으므로 os.system(cmd)을 루프에서 사용하면 .mp4 파일을 모두 통과하지 못한다. 각각의 비디오가 끝난 후에 프로세싱 프로그램을 죽인 채로 거기 앉아 있었다. 설정된 시간이 지난 후 서브 프로세스가 종료되지 않습니다.

나는 영상이 끝난 후 종료있어 서브 프로세스 (미리 정해진 시간)을 사용하여이 문제를 해결하려 그러나

for file in os.listdir(myPath): 
    if file.endswith(".mp4"): 
     vidfile = os.path.join(myPath, file) 
     command = "./Tracking " + vidfile 
     p = subprocess.Popen(command, shell=True) 
     sleep(840) 
     p.terminate() 

Tracking 프로그램이 아직 종료하지 않습니다, 그래서 나는 끝낼 수많은 동영상이 동시에 열립니다. 각 개별 프레임을 강제 종료하거나 프로그램의 해당 특정 인스턴스의 ID에 kill -9 id을 사용하여 강제로 제거 할 수 있습니다. 나는 shell=True을 사용하는 것이 좋지 않다고 읽었지 만,이 문제가 발생하는지 확신 할 수 없습니다.

특정 시간이 지난 후에 Tracking 프로그램을 죽일 수있는 방법은 무엇입니까? 저는 파이썬에 매우 익숙하며 이것을하는 방법을 모르겠습니다. sleep() 후에 os.system("kill -9 id")과 같은 일을 고려하고 있었지만 프로그램의 ID를 얻는 방법을 알지 못합니다.

+0

.kill()을 사용하여 행운이 있는지 확인하십시오. 또한, 어떤 시스템을 실행하고 있습니까? –

+0

당신은 이름으로 프로그램을 죽일 수 있습니다. 당신은 pid가 필요 없습니다. –

+0

'shell = True'는 당신의 플랫폼에 따라이 동작을 할 수 있습니다. 당신이 그것을 사용할 때, 당신은 실제 프로세스에 대한 핸들을 갖고 있지 않다. 당신은 쉘에 대한 핸들을 가지고있다. 하지만 정말로, 왜'shell = True'를 사용하고 싶습니까? 왜 그런 식으로 올바른 방법을 쓰는 것이 좋을까요? 잘못된 방식으로하는 것만 큼 쉽습니다. 어떻게되는지보십시오. – abarnert

답변

2

드롭 shell=True, 프로세스를 종료 할 p.kill()를 사용

import subprocess 
from time import time as timer, sleep 

p = subprocess.Popen(["./Tracking", vidfile]) 
deadline = timer() + 840 
while timer() < deadline: 
    if p.poll() is not None: # already finished 
     break 
    sleep(1) 
else: # timeout 
    try: 
     p.kill() 
    except EnvironmentError: 
     pass # ignore errors 
    p.wait() 

를 그 다음 수 있도록 새로운 프로세스 그룹을 만들고 대신 죽이려고하지 않습니다. How to terminate a python subprocess launched with shell=True을 참조하십시오.

+0

, 나는'subprocess.Popen'에 대한 오류를 얻을 : '파일 "/usr/lib/python2.7/subprocess.py", 라인 679을 __init__ errread, errwrite에서) 파일 "/usr/lib/python2.7/subprocess.py", 줄 1249, _execute_child에 raise child_exception OSError : [Errno 2] 해당 파일이나 디렉토리가 없습니다. ' – anodi

+0

^^ 신경 쓰지 마세요. 고맙습니다! – anodi

관련 문제