在python中打开应用程序时的错误处理

时间:2013-10-24 03:08:49

标签: python file error-handling subprocess

我需要使用python在特定应用程序中打开一个文件。我将默认使用默认的app location / filename打开文件;但是,如果应用程序无法打开,我想处理该错误并给用户一些其他选项。

到目前为止,我已经了解到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

原来的转码并不是这样,因为正确和错误的名称都会给出大于0的值。

3 个答案:

答案 0 :(得分:0)

这显示了什么?

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

您收到的错误消息显示您尝试打开的应用程序不存在。

如果没有找到,你就不会得到例外。

答案 1 :(得分:0)

试试这个。它将使用默认编辑器打开文件(如果已安装)。

ss=subprocess.Popen(FileName,shell=True)
ss.communicate()

答案 2 :(得分:0)

我无法控制用户与我正在打开的文件关联的应用程序。

我需要能够指定要使用的应用程序和要打开的文件。

如果无法打开应用程序/文件,

subprocess.call不会返回异常。

这是朋友subprocess.check_call

来自文档:http://docs.python.org/2/library/subprocess.html#subprocess.check_call

  

如果返回码为零,则返回,否则加注   CalledProcessError。 CalledProcessError对象将返回   返回码属性中的代码。

我在下面提供了我的用法示例以供将来参考

对于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)