1

当我将 IPython 与该-wthread选项一起使用时,它会生成一个 python 子进程,它显示为 Mac OS X 应用程序。

我的问题是,当我向该应用程序发送命令(例如使用 绘图matplotlib)时,窗口会在我所有其他窗口后面更新。我希望能够调用 python 命令来将这个 python 窗口切换到前面(我使用 ⌘-tab 手动执行此操作,但我必须先找到 python 应用程序,并且可能有几个)。

是否有 python 脚本来检测 IPython 产生了哪个应用程序,以及如何在 OS X 中自动切换到它?

(我说的是 OS X 中的问题,但其他系统上的问题应该类似)。

编辑:让我将其分解为两个问题:

  1. 如何知道哪个 Mac OS X 应用程序 python 正在运行?(可能有一些 IPython 巫术)
  2. 如何告诉 Mac OS X 将重点放在该应用程序上?(也许使用苹果脚本)
4

2 回答 2

1

可能是:

  1. 制作一个新的 python 脚本来跟踪另一个脚本的孙进程可能会很棘手。IPython 文档有一个通过 pid 监控衍生进程的示例;作业控制。JobControl 只会杀死进程,但我想添加一个命令来更改窗口焦点会相当容易。

  2. 根据我的阅读,Tk gui 没有正确设置 Mac 上的窗口焦点。如果您的“matplotlib”或以其他方式使用 Tk gui,这可能是问题所在。-来源-

我对 OS X 不是很熟悉,所以要么使用它们运行,要么澄清你的情况,或者让我知道我是否离得太远。

于 2010-02-14T12:27:14.640 回答
1

这是我的完整解决方案,带有 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() 在另一个进程中运行对 appscript 的调用的原因;它可能与一些线程问题有关......任何解释都会受到赞赏)

于 2010-02-19T15:54:19.047 回答