【问题标题】:Is there an platform independent equivalent of os.startfile()?是否有一个独立于平台的 os.startfile() 等价物?
【发布时间】:2013-06-26 10:08:28
【问题描述】:

我想在多个平台(包括 Mac OS)上运行一个程序,所以我尽量保持它与平台无关。我自己使用 Windows,我有一条线 os.startfile(file)。这适用于我,但不适用于其他平台(我在文档中阅读过,我没有为自己测试过)。

是否有适用于所有平台的等价物?

顺便说一下,该文件是.wav 文件,但我希望用户能够使用他们的标准媒体播放器,以便他们可以暂停/倒带该文件。这就是我使用os.startfile() 的原因。我也许可以使用还允许播放/暂停/倒带媒体文件的库。

【问题讨论】:

标签: python platform


【解决方案1】:

跨平台文件打开模块似乎还不存在,但您可以依赖流行系统的现有基础架构。这个 sn-p 涵盖了 Windows、MacOS 和类 Unix 系统(Linux、FreeBSD、Solaris...):

import os, sys, subprocess

def open_file(filename):
    if sys.platform == "win32":
        os.startfile(filename)
    else:
        opener = "open" if sys.platform == "darwin" else "xdg-open"
        subprocess.call([opener, filename])

【讨论】:

  • 谢谢,我希望这可行。一旦可以在其他平台上测试程序,我会尽快接受您的回答。
  • 对于 Windows,应省略文件名周围的引号。这对其他平台有影响吗?
  • @Lewistrick 没有引号的文件或目录名称中带有空格的文件将无法工作,这始终是一个等待发生的错误。我现在将答案编辑为在 Win32 上简单地使用 os.startfile,并在其他地方打开/xdg-open。现在 Windows 是分开处理的,代码可以使用subprocess.call 来处理带有空格或特殊字符的文件名。 (在 Windows 上,startcmd 的一部分,所以没有shell=Truesubprocess.call 将不起作用。)
  • 谢谢!我可以为删除文件做类似的事情吗?对于 Windows 和 Unix,我可以使用 os.remove(),如果我是对的,MacOS 使用 rm 来删除。我可以在 MacOS 中使用subprocess.call(["rm", filename]) 吗?
  • @Lewistrick os.remove 将适用于所有三个操作系统,所以我建议你坚持下去。 MacOS 在大多数较低级别的事物中都接近 POSIX 系统。
【解决方案2】:

只需使用webbrowser.open(filename)。它可以在适当的地方调用os.startfile()openxdg-open

注意,有scary text in the docs

请注意,在某些平台上,尝试使用此方法打开文件名 功能,可以工作并启动操作系统的相关联 程序。但是,这既不支持也不可移植。

它对我来说很好用。在您的环境中进行测试。

查看webbrower's source code,了解需要完成多少工作才能实现可移植性。

Python 错误跟踪器上还有一个未解决的问题——Add shutil.open。 “portable os.startfile()”接口比预期的要复杂。您可以尝试提交的补丁,例如shutil.launch()

【讨论】:

  • 这在 OS X 上不起作用。在 Python 2.7 和 Python 3 上,它返回 True 但实际上并没有做任何事情。
  • @LukeTaylor 我相信 webbrowser 在 OS X 上使用open 命令。如果它不适合您,那么创建一个最小的代码示例并将其作为单独的问题发布。
  • 这对我来说不是什么大问题,我只是想让你知道。
  • @LukeTaylor 没有重现问题的特定代码示例;它不是很有用。很难写:python -m webbrowser my.wav 并描述正在发生的事情,提及您的操作系统、python 版本。就是这样。
【解决方案3】:

这取决于您对平台无关的含义。如果您的问题是关于如何使用操作系统的默认操作打开 anything,例如,当您双击某个文件让操作系统决定如何打开它时,那么简单的答案是 不。

但是,要自己实现此功能非常容易,但您需要使用几种不同的方法来适应不同的操作系统。也就是说,最宽容的方法是使用os.system(WinPathWithArgs),正如我已经解释过的in this answer

【讨论】:

    【解决方案4】:

    试试这个:

    import subprocess
    
    subprocess.Popen(["open", 'directory'])
    

    【讨论】:

    • mac os 可以打开任意目录(文件夹)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多