Как переключиться на подпроцесс python, созданный IPython (на OS X)? - PullRequest
1 голос
/ 14 февраля 2010

Когда я использую IPython вместе с опцией -wthread, он порождает подпроцесс python, который отображается как приложение Mac OS X.

Моя проблема заключается в том, что когда я отправляю команды этому приложению (например,заговор с matplotlib), окно обновляется за всеми моими другими окнами.Я хотел бы иметь возможность вызывать команду python для переключения этого окна python на передний план (я делаю это вручную с помощью ⌘-tab, но сначала мне нужно найти приложение python, а их может быть несколько).

Существует ли сценарий Python для определения того, какое приложение IPython породило, и как затем автоматически переключаться на него в OS X?

(Я заявляю о проблеме в OS X, но проблема должна бытьаналогично другим системам).

Редактировать: позвольте мне разбить это на две проблемы:

  1. как узнать, в каком Python приложения Mac OS X работает?(возможно, это возможно с помощью некоторых хитростей IPython)
  2. как сказать Mac OS X сосредоточиться на этом приложении?(возможно, с использованием appleScript)

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Вот мое полное решение с волшебной функцией IPython.

Установите appscript (см. этот вопрос о программном переключении приложений в OS X) и поставьтеследующий код в скрипте с именем activate.py в папке ~/.ipython.

import appscript
import sys
appscript.app(pid=int(sys.argv[1])).activate()

Теперь отредактируйте файл конфигурации ~/.ipython/ipy_user_conf.py и определите магическую функцию:

def wxactivate(self, arg):
   import wx
   pid = wx.GetProcessId()
   ip = self.api
   import os
   here = os.path.dirname(__file__)
   import subprocess
   subprocess.Popen([os.path.join(here, 'activate.py'), str(pid)])

Теперь вам просто нужно зарегистрировать эту волшебную функцию IPython, поместив в этот же файл конфигурации следующее:

ip.expose_magic('wxactivate', wxactivate)

Теперь, после запуска IPython -wthread, вы можете вызвать %wxactivate и переключиться насоответствующее приложение Python!

(обратите внимание, что причина, по которой нужно запускать вызов приложения activate() в другом процессе , мне неясна; возможно, это связано с некоторымипроблема с потоками ... любое объяснение приветствуется)

1 голос
/ 14 февраля 2010

Может быть либо:

  1. Создание нового скрипта Python, который отслеживает процессы внуков другого скрипта, может быть сложным. В документации IPython есть пример для мониторинга порожденных процессов с помощью pid; JobControl . JobControl только убивает процессы, но я думаю, что добавить команду для изменения фокуса окна было бы довольно просто.

  2. Из того, что я прочитал, графический интерфейс Tk неправильно устанавливает фокус окна на Mac. Если ваш 'matplotlib' или иным образом использует графический интерфейс Tk, это может быть проблемой. - источник

Я не очень знаком с OS X, так что либо бегите с ними, проясните ситуацию или дайте мне знать, если я слишком далеко.

...