Все, кто увлекается Python, наверно, слышали об редакторе Spyder, который входит практически во все сборки пакетов python. Я использую WinPython, и Spyder лежит в корне папки в виде файла Spyder.exe. Какое же мое было удивление, когда при открытом редакторе Spyder я пытаюсь через контекстное меню Edit with Spyder открыть файл, но ничего не происходит. То есть Spyder не активирует окно. При этом файл открывается в самом редакторе, но сам Spyder остается неактивным или свернутым. В какой-то момент такая дикость стала сильно напрягать , поэтому написал маленький скрипт для решения этой проблемы.

Предыстория
Сначала я, конечно, долго смирялся c такой странной фичей. Если, например, я открою файл в блокноте, то он сразу появится поверх всех окон и станет активным. Первое, что я решил — написать следует с помощью скрипта AutoHotKey. Будущий скрипт очень простой: он принимает путь до файла, запускает Spyder с нужным файлом и делает его главное окно активным на весь экран. Выбор Autohotkey был очевиден, потому что в нем очень легко можно управлять окнами. Можно искать по заголовку окна, делать его активным или максимизировать окно и т.д.
Так как на питоне уже были готовые куски запуска программ, оставалось только найти какой-то питоновский пакет для поиска и управления окнами Windows. Поэтому решил попробовать найти что-нибудь на python. Вдруг будет что-то наподобие AutoHotKey, такое же простое в использовании. Буквально с первой ссылки в поисковике нашел такой пакет: pygetwindow
. Посмотрел пример использования и сразу понял, это прям то, что нужно. Проще просто некуда.
Установка стандартная через pip: pip install pygetwindow
Или через python.exe путь_до_python\python.exe -m pip install pygetwindow
Приведу сразу пример по поиску окна Spyder, он совсем несложный
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pygetwindow as gw list_titles = gw.getAllTitles() title_spyder = '' for title_ in list_titles: if title_.find('Spyder'): title_spyder = title_ break if title_spyder != '': spyder = gw.getWindowsWithTitle(title_spyder)] spyder.maximize() spyder.activate() |
В примере выше во всех заголовках окон ищется подстрока ‘Spyder’. После того, как нашлось, по этому заголовку находится окно и делается активным на весь экран.
Остальная часть скрипта банальный запуск процесса Spyder.exe с аргументом в виде пути до нужного файла. Запуск делаю через стандартный subprocess
(скрипт можно скачать ниже)
Изменение контекстного меню
При регистрации WinPython в системе Windows прописываются в контекстные меню для файлов с расширением .py следующие пункты: Edit with IDLE, Edit with Spyder

Нужно вместо стандартного запуска Spyder добавить в контекстное меню запуск скрипта. Для того, чтобы отредактировать эти меню и добавить свое, нужно открыть редактор реестра Windows. Для запуска используем быстрые клавиши WIN+R и пишем в появившемся окне regedit (видео в помощь)
Далее идем по папкам слева в панели HKEY_CURRENT_USER\SOFTWARE\Classes\Python.File\shell
. Заходим внутрь раздела Edit With Spyder, ищем подраздел command и в нем меняем путь

1 | C:\Python\Spyder.exe" "%1" |
на новый путь
1 | "c:\Python\bin\pythonw.exe" "c:\Python\Scripts\Tools\spyder_open_file_and_activate\spyder_open_file_and_activate.py" "%1" |
Только не забывайте ставить свои настоящие пути до питона и до скрипта.
Я лично еще удалил пункт меню с Edit with IDLE
путем удаления соответствующей папки в том же разделе, где правил пути выше.
Также я вставил дополнительно на панель totalcmd иконку на запуск, чтобы удобно открывать в разных средах файлы

Скачать
скрипт spyder_open_file_and_activate.py (обязательно поменяйте путь до Spyder.exe)