一尘不染

在Windows和Mac OS中都使用Python中的默认OS应用程序打开文档

python

我需要能够使用Windows和Mac OS中的默认应用程序打开文档。基本上,我想做的事情与您在资源管理器或Finder中双击文档图标时发生的事情相同。用Python做到这一点的最佳方法是什么?


阅读 837

收藏
2020-02-17

共1个答案

一尘不染

WindowsMac OS中都使用Python中的默认OS应用程序打开文档open并且start是为Mac OS /X和Windows命令解释器的东西分别,要做到这一点。

要从Python调用它们,可以使用subprocessmoduleos.system()

以下是有关使用哪个软件包的注意事项:

你可以通过致电给他们os.system,该电话有效,但是…

转义: os.system仅适用于路径名中没有空格或其他shell元字符的文件名(例如A:\abc\def\a.txt),否则需要转义。有shlex.quote针对Unix的系统,但没有Windows的真正标准。也许还会看到python,windows:使用shlex解析命令行

  • MacOS / X:os.system("open " + shlex.quote(filename))

  • Windows:也应避免os.system("start " + filename)在正确的地方说话filename
    你也可以通过subprocess模块调用它们,但是…

对于Python 2.7及更高版本,只需使用

subprocess.check_call(['open', filename])

在Python 3.5+中,你可以等效地使用稍微更复杂但也更通用的功能

subprocess.run(['open', filename], check=True)

如果你需要一直兼容到Python 2.4,则可以使用subprocess.call()并实现自己的错误检查:

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

现在,使用的好处是subprocess什么?

  • 安全性:从理论上讲,这是更安全的方法,但是实际上我们需要以一种或另一种方式执行命令行。在这两种环境中,我们都需要环境和服务来解释,获取路径等。在这两种情况下,我们都不执行任意文本,因此它没有固有的“但你可以键入'filename ; rm -rf /'”问题,并且如果文件名可以被破坏,则使用subprocess.call几乎没有提供额外的保护。
  • 错误处理:实际上,它并没有给我们提供更多的错误检测功能,retcode无论哪种情况,我们仍然要依靠;但是在发生错误的情况下明确引发异常的行为肯定会帮助你注意到是否存在故障(尽管在某些情况下,回溯可能根本不比简单地忽略错误更有用)。
  • 产生一个(非阻塞)子过程:我们不需要等待子过程,因为我们通过问题陈述来启动一个单独的过程。
    反对“但subprocess首选”。但是,os.system()它不被弃用,从某种意义上说,它是完成此特定工作的最简单工具。结论:os.system()因此使用也是正确的答案。

明显的缺点是Windows start命令要求你传递shell=True,否定了使用的大多数好处subprocess

2020-02-17