2013-10-24 64 views
1

我需要使用python在特定應用程序中打開文件。我將默認使用默認的應用程序位置/文件名打開文件;但是,如果應用程序無法打開,我想處理該錯誤並給用戶一些其他選項。在Python中打開應用程序時出錯處理

我瞭解到目前爲止該subprocess.call是做到這一點的最好辦法,而不是system.os

應用:/Applications/GreatApp.app

這工作得很好

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

但是,當我開始添加try/except循環時,它們似乎什麼都不做。 (請注意在應用程序名稱的空間 - 我使用的是不正確的名稱來強制除外)

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

我還是會看到在Python

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

最近我」顯示以下錯誤已發現某種形式的錯誤處理如下。正在看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 

原來RETCODE是沒有辦法的辦法,因爲這兩個正確和不正確的名稱賦予大於0

+0

是啊,在RETCODE做法是正確的。也許嘗試交換最後一個代碼片段中的「subprocess.call」參數與第一個參數? 'shell = True'會導致一個間接級別,在這種情況下應該是不必要的,因爲'open'不是一個shell命令。 – jtmoulia

+0

感謝您的確認 - 我更深入地發現,如果retcode <0:發現更改爲如果retcode == 1:將處理文件名/路徑的錯誤。我假設subprocess.call的返回碼只返回1或0? (編輯:sp) – Simon

+0

「subprocess.call()」的'args'參數中的第一項不應該是應用程序嗎? – martineau

回答

0

我沒有對用戶已與我打開文件關聯的應用程序的控制。

我需要能夠指定要使用的應用程序和要打開的文件。

subprocess.call如果應用程序/文件無法打開,則不會返回異常。

這是朋友subprocess.check_call,確實。

從文檔:http://docs.python.org/2/library/subprocess.html#subprocess.check_call

如果返回代碼是零,則返回,否則養 CalledProcessError。 CalledProcessError對象將在returncode屬性中返回 代碼。

我已經提供我下面的用法示例以供將來參考

對於OSX

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 

對於Windows,改變這一行

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

這說明了什麼價值?

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

您收到的錯誤消息表示您嘗試打開的應用程序不存在。

如果它不像您發現的那樣,您將不會收到異常。

0

試試這個。如果安裝了它,它將使用其默認編輯器打開文件。

ss=subprocess.Popen(FileName,shell=True) 
ss.communicate() 
相關問題