2014-04-28 3 views
0

순차적으로 응용 프로그램을 열고 닫으려고합니다. 하지만 문제는 응용 프로그램이 열리고 있지만 그 응용 프로그램의 닫기 라인 인 다음 줄에 들어가려면 응용 프로그램을 수동으로 닫아야한다는 것입니다.파이썬에서 순차적으로 열고 닫는 응용 프로그램

import os 
os.system("scad3 file.txt") 
os.system("TASKKILL /PID scad3.exe /T") 

scad3 내가 실행하고자하는 응용 프로그램입니다,하지만 즉, 라인을 taskkilling, 내가 수동으로 은 알려 주시기 바랍니다 윈도우를 해결하기 위해 어떤 방법이 종료해야 다음 줄을 입력 ??

대단히 감사합니다.

답변

3

os.system은 (는) 블로킹 호출입니다. 파이썬으로는 popen 개체를 사용해보십시오 : -

import subprocess 
p = subprocess.Popen("notepad.exe") 
p.terminate() 

를 참조하십시오 https://docs.python.org/2/library/subprocess.html#popen-objects

+3

추측은 없습니다. 'subprocess.call'에 대한 ['documentation'] (https://docs.python.org/2/library/subprocess.html#subprocess.call)의 첫번째 문장은 "args에 기술 된 명령을 실행하십시오. ** Wait ** 명령을 완료하려면 returncode 속성을 반환하십시오. " – luk32

+0

OP에서 실제 프로그램 args를 사용하는 것이 도움이 될 것입니다 :'Popen ([ "scad3.exe", "file.txt"])'. 'p.terminate()'의 뒤에'rc = p.wait()'를 추가해, 프로그램이 닫힐 때까지 대기하십시오. – jfs

+0

p.terminate() 행이 작동하지만 문제는 응용 프로그램이 그 아래의 루프를 고려하지 않고 실행 중입니다. – user3582828

0

할 수 있습니다이 완료되지 않은 경우 다음 명령을 실행 주어진 시간을 기다린 결과를 얻기 위해 시도하거나 subrocess을 죽이고는 popen를 사용해보십시오 . 프로그램이 자동으로 종료되지 않을 경우 수동이의 descriged 방법을 사용하여 죽일 당신이 접근 방식을 수정할 수 있습니다 이제

import time 

cmd = "scad3 file.txt" 
cmd_out = run_command_str(cmd) 
expected_execution_time = 5 
time.sleep(expected_execution_time) 
if cmd_out['err'] != '': 
    pass # handle error here 

:

import subprocess 

def get_array_from_cmd_str(cmd_str): 
    cmd_str_parts = cmd_str.split(" ") 
    return [cmd_part for cmd_part in cmd_str_parts] 

def run_command_str(command): 
    p = subprocess.Popen(get_array_from_cmd_str(command), 
         stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0] 
    resp = {'out': p[0], 
      'err': p[1]} 
    return resp 

는 명령이이 방법으로 위의 "run_command_str"기능을 사용하여 실행 this thread.

(Windows에서 테스트하지 예)

편집 : 코드 소중한 의견에 따라 수정. 예는 차단 호출을하고 문제를 해결하지 않습니다. 다른 것들을 사용하십시오.

+0

OP는 프로그램이 끝날 때까지 기다리지 않고 프로그램을 시작할 수있는 방법을 요구합니다. '.communicate()'는 명령이 종료 될 때까지 기다립니다. Windows에서는 항상 명령을 문자열로 전달할 수 있습니다 (기본 인터페이스 (CreateProcess) 임). 공백에서 나누는 것은 허약합니다. 유효한 명령 일지라도 실패 할 수도있는 불필요한'str()'호출을 버린다. 'scad3'은 의미있는 stdout/stderr가없는 GUI 프로그램 일 수 있습니다. 'is not' 대신에'! ='를 사용하여 문자열을 비교하십시오. 'is'는 객체의 ID가 아닌 값을 비교합니다. dict을 반환하는 대신 명명 된 튜플을 사용할 수 있습니다. – jfs

+0

의견을 보내 주셔서 감사합니다. 이 apprach는 일반적으로 유효하지 않으며 특정 경우에만 작동한다는 것에 동의합니다. 다른 대답이 더 적절할 수 있습니다. 명명 된 튜플은 사전에 비해 어떤 장점이 있습니까? –

+0

'.communicate()'만 제거하고 모든 것이 계속 작동 할 것이라고 기대할 수는 없습니다. 예를 들어'Popen()'과'.communicate()'는 반환 값이 다릅니다. 명명 된 튜플은 일반 튜플과 같지만 항목에는 이름이 있습니다. 그것은 dict보다 가볍습니다.사용법은 선택 사항입니다. – jfs

관련 문제