2013-10-24 2 views
1

파이썬을 사용하여 특정 응용 프로그램에서 파일을 열어야합니다. 기본 앱 위치/파일 이름을 사용하여 파일을 열도록 기본값을 설정합니다. 그러나 응용 프로그램을 열 수없는 경우, 나는 그 오류를 처리하고 사용자에게 다른 옵션을 제공하고 싶습니다.파이썬에서 응용 프로그램을 열 때 오류 처리

지금까지 이해 한 것을 subprocess.call이 작업을 수행하는 가장 좋은 방법입니다,

응용 프로그램 system.os 반대로이 잘

작동 /Applications/GreatApp.app

subprocess.call(['open','/Applications/GreatApp.app','placeholder.gap']) 

그러나 try/except 루프를 추가하기 시작하면 아무것도 수행하지 않는 것 같습니다. 난 아직도 파이썬

The file /Applications/Great App.app does not exist. 

가장 가까운 I '에 표시되는 다음과 같은 오류를 볼 수 있습니다

try: 
    subprocess.call(['open','/Applications/Great App.app','placeholder.gap']) 
except: 
    print 'this is an error placeholder' 

을 - (나는 예외를 강제로 잘못된 이름을 사용하고 응용 프로그램 이름의 공간을 참고) 오류 처리의 몇 가지 형태로 발견 한 것은 다음과 같습니다. 이것에 대해 올바른 방향으로 retcode의 가치를 찾고 있습니까?

try: 
    retcode = subprocess.call("open " + filename, shell=True) 
    if retcode < 0: 
     print >>sys.stderr, "Child was terminated by signal", -retcode 
    else: 
     print >>sys.stderr, "Child returned", retcode 
except OSError, e: 
    print >>sys.stderr, "Execution failed:", e 

는 모두 정확하고 잘못된 이름 값이 쇼를 무엇을 0보다 큰

+0

그래을 변경 RETCODE 접근 방식은 올바른 것입니다. 아마도 마지막 코드 조각의'subprocess.call' 인수를 첫 번째 코드 조각과 바꿔보십시오. 'shell = True'는 간접적 인 수준이되고,'open'이 쉘 명령이 아니기 때문에 불필요합니다. – jtmoulia

+0

확인해 주셔서 감사합니다. - 더 자세히 보았을 때 retcode <0 : retcode == 1 :로 설정하면 파일 이름/경로와 관련된 오류를 처리 할 수있었습니다. subprocess.call 반환 코드가 1 또는 0 만 반환한다고 가정합니다. (편집 : sp) – Simon

+0

'subprocess.call()'의'args' 인수의 첫 번째 항목이 응용 프로그램이 아니어야합니까? – martineau

답변

0

사용자가 내가 여는 파일과 연결된 응용 프로그램에 대한 제어권이 없습니다.

사용할 응용 프로그램과 열 파일을 지정할 수 있어야합니다.

subprocess.call 응용 프로그램/파일을 열 수 없으면 예외가 반환되지 않습니다.

친구가 subprocess.check_call입니다. 워드 프로세서

: 리턴 코드가 0 다음 반환 된 경우 http://docs.python.org/2/library/subprocess.html#subprocess.check_call

, 그렇지 않으면 CalledProcessError을 올립니다. CalledProcessError 객체는 returncode 속성에 코드를 반환합니다.

내가 Windows의

FNULL = open(os.devnull, 'w') # Used in combination with the stdout variable 
           # to prevent output from being displayed while 
           # the program launches. 
try: 
    # First try the default install location of the application 
    subprocess.check_call(['open','/Applications/Application.app',filename], stdout=FNULL) 
except subprocess.CalledProcessError: 
    # Then ask user to manually enter in the filepath to Application.app 
    print 'unable to find /Applications/Application.app' 
    # Now ask user to manually enter filepath 

OSX

를 들어 나중에 참조

아래 내 사용 예제를 제공했습니다,이 라인을

subprocess.check_call(['C:\file\to\program',filename], stdout=FNULL) 
0

줄로 RETCODE 방식이 아닌 밝혀?

subprocess.call (['ls', '-l', '/Applications']) 

열려고하는 응용 프로그램이 없다는 오류 메시지가 표시됩니다.

그리고 발견하지 못하면 예외가 발생하지 않습니다.

0

함께 시도해보십시오. 기본 편집기가 설치된 경우 파일이 열립니다.

ss=subprocess.Popen(FileName,shell=True) 
ss.communicate() 
관련 문제