2013-06-26 3 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 Без кавычек файлы с пробелами в имени файла или каталога не будут работать, что всегда будет ошибкой. Теперь я отредактировал ответ, чтобы просто использовать 'os.startfile' на Win32 и открыть/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 - Add shutil.open. «Портативный интерфейс os.startfile() оказался более сложным, чем ожидалось. Вы можете попробовать представленные исправления, например, shutil.launch().

+0

Это не будет работать на OS X. На обоих Python 2.7 и Python 3 это возвращает 'True', но на самом деле ничего не делает. –

+0

@ LukeTaylor Я считаю, что webbrowser использует команду 'open' для OS X. Если это не сработает для вас, тогда создайте минимальный пример кода и опубликуйте его как отдельный вопрос. – jfs

+0

Меня это не волнует, я просто хотел сообщить вам. –