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