2013-06-26 70 views
15

我想在多個平臺(包括Mac OS)上運行程序,所以我儘量保持平臺獨立。我自己使用Windows,並且我有一條線os.startfile(file)。這適用於我,但不適用於其他平臺(我在文檔中閱讀,我沒有爲自己測試過)。是否存在與os.startfile()等效的平臺?

是否有適用於所有平臺的工作原理等同?

順便說一句,該文件是一個.wav文件,但我希望用戶能夠使用他們的標準媒體播放器,以便他們可以暫停/倒帶文件。這就是爲什麼我使用os.startfile()。我可能能夠使用也允許播放/暫停/倒回媒體文件的庫。

+0

嘗試:http://www.pygame.org/project-Python+Media+Player-185-.html –

+0

相關:[啓動另一個程序通過Python>單獨地<](http://stackoverflow.com/q/13078071/4279) – jfs

回答

26

看來,一個跨平臺的文件打開模塊還不存在,但可以依靠現有流行的系統的基礎設施。這個片段涵蓋的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]) 
+0

謝謝,我希望這可以工作。只要我可以在其他平臺上測試該程序,我會盡快接受您的答案。 – Lewistrick

+0

對於Windows,應忽略文件名周圍的引號。這對其他平臺有影響嗎? – Lewistrick

+0

@Lewistrick如果文件或目錄名稱中沒有空格的文件不起作用,這總是一個等待發生的錯誤。我現在編輯的答案只是在Win32上使用'os.startfile',並在別處打開/ xdg-open。現在Windows單獨處理,代碼可以使用'subprocess.call'來處理帶有空格或特殊字符的文件名。 (在Windows上,'start'是'cmd'的一部分,所以'subprocess.call'沒有'shell = True'將不起作用。) – user4815162342

1

只需使用webbrowser.open(filename)。它可以在適當的情況下調用os.startfile(),open,xdg-open

當心,有scary text in the docs

注意,在某些平臺上,嘗試使用此功能 一個文件名,可以工作,並啓動操作系統的相關 程序。但是,這既不支持也不便攜。

它工作正常的我。在你的環境中測試它。

webbrower's source code,看看需要多少工作要做,以可移植的。

還有Python的bug跟蹤系統,開放式的問題 - Add shutil.open。 「可移植的os.startfile()」接口證明比預期更復雜。您可以嘗試提交的修補程序,例如shutil.launch()

+0

這不適用於OS X.在Python 2.7和Python 3上,這將返回「True」,但實際上並沒有做任何事情。 –

+0

@LukeTaylor我相信webbrowser在OS X上使用'open'命令。如果它不適合你,那麼創建一個最小代碼示例並將其作爲一個單獨的問題發佈。 – jfs

+0

這對我來說不是一個大問題,我只是想讓你知道。 –

相關問題