Подтвердить что ты не робот

Существует ли межплатформенный способ открытия файлового браузера в Python?

Я что-то думаю по строкам модуля webbrowser, но для файловых браузеров. В Windows я хотел бы открыть проводник, в GNOME на Linux, я хочу открыть nautilus, Konqueror на KDE и т.д. Я бы предпочел не собираться, если я могу его избежать.; -)

4b9b3361

Ответ 1

Я бы предпочел не собираться, если я могу избежать этого.

Weeell Я думаю, вам понадобится немного взломанного платформой, но, надеюсь, не так сильно, как жуткий командный модуль webbrowser. Вот первый удар по нему:

if sys.platform=='win32':
    subprocess.Popen(['start', d], shell= True)

elif sys.platform=='darwin':
    subprocess.Popen(['open', d])

else:
    try:
        subprocess.Popen(['xdg-open', d])
    except OSError:
        # er, think of something else to try
        # xdg-open *should* be supported by recent Gnome, KDE, Xfce

Обратите внимание, что версия win32 в настоящее время не выполняется для пробелов в именах файлов. Ошибка 2304 может быть чем-то связана с этим, но, похоже, основная проблема связана с экранированием параметров и оболочкой Windows (cmd /c ...), в том, что вы не можете вставлять двойные кавычки, и вы не можете ^ -изменить кавычки или пробелы. Мне не удалось найти какой-либо способ процитировать и запустить cmd /c start C:\Documents and Settings из командной строки вообще.

Комментарий ETA re nosklo: только для Windows, есть встроенный способ сделать это:

if sys.platform=='win32':
    os.startfile(d)

Здесь не очень-то приятное альтернативное решение для поиска оболочки и открытия папки с ней, которую вам теперь не нужно, но я уйду. (Отчасти потому, что это может быть полезно для чего-то другого, но в основном потому, что я потратил время, чтобы напечатать проклятую вещь!)

if sys.platform=='win32':
    import _winreg
    path= r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon')
    for root in (_winreg.HKEY_CURRENT_USER, _winreg.HKEY_LOCAL_MACHINE):
        try:
            with _winreg.OpenKey(root, path) as k:
                value, regtype= _winreg.QueryValueEx(k, 'Shell')
        except WindowsError:
            pass
        else:
            if regtype in (_winreg.REG_SZ, _winreg.REG_EXPAND_SZ):
                shell= value
            break
    else:
        shell= 'Explorer.exe'
    subprocess.Popen([shell, d])

Ответ 2

Это полный удар в темноте, но посмотрите wxPython, который обеспечивает привязки Python к базовому wxWidgets. Прошло много времени с тех пор, как я в последний раз смотрел на него, но там может быть что-то, что вы можете использовать. В противном случае должно быть относительно легко создать собственный файловый браузер, который будет использовать собственные "виджеты" для каждой ОС.

Помните, что wxPython не является легким весом, он действительно расширит ваше приложение и увеличит ваши зависимости.

Ответ 3

Я не знаю, существует ли готовый к использованию модуль, но если он есть, он должен находиться в cookie-методе Activestate python (http://code.activestate.com/recipes/langs/python/)

Кроме того, по крайней мере, в gnome и на mac os вы можете выполнить "gnome-open http://blah" и "открыть http://blah" (на mac); оба будут открывать URL-адрес в предпочтительном браузере пользователя.

Для linux также проверьте freedesktop.org - общий набор инструментов, охватывающих как Gnome, так и KDE, которые должны включать что-то подобное.