1

我需要使用 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 的值。

4

3 回答 3

0

这说明了什么?

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

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

如果它不是你发现的那样,你不会得到一个例外。

于 2013-10-24T04:21:30.373 回答
0

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

ss=subprocess.Popen(FileName,shell=True)
ss.communicate()
于 2013-10-24T06:43:15.800 回答
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)
于 2013-11-12T15:29:32.690 回答