代码之家  ›  专栏  ›  技术社区  ›  Olivier Verdier

如何切换到ipython创建的python子进程(在OSX上)?

  •  1
  • Olivier Verdier  · 技术社区  · 15 年前

    当我使用ipython的时候 -wthread 选项,它生成一个python子进程,该子进程显示为mac os x应用程序。

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

    是否有一个python脚本来检测ipython生成了哪些应用程序,以及如何在OSX中自动切换到它?

    (我在OSX中说明了这个问题,但在其他系统中这个问题应该类似)。

    编辑:让我把这分为两个问题:

    1. 如何知道运行在哪个Mac OS X应用程序python中?(可能有伊普敦巫术)
    2. 如何告诉Mac OS X将重点放在该应用程序上?(可能使用AppleScript)
    2 回复  |  直到 15 年前
        1
  •  1
  •   Sleepingrock    15 年前

    可以是:

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

    2. 据我所读,tk gui没有在macs上正确设置窗口焦点。如果您的“matplotlib”或使用tk gui,这可能是问题所在。- source -

    我对OSX不太熟悉,所以要么跟他们一起跑,澄清一下你的情况,要么告诉我我离得太远了。

        2
  •  1
  •   Community CDub    8 年前

    这是我的完整解决方案,有一个ipython魔力函数。

    安装 appscript (参见 this question 关于在OS X中以编程方式切换应用程序),并将以下代码放入名为 activate.py 在你 ~/.ipython 文件夹。

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

    现在,编辑您的 ~/.ipython/ipy_user_conf.py 配置文件和定义magic函数:

    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应用程序!

    (请注意,必须运行对AppScript的调用的原因 activate() 在另一个过程中 我不太清楚,这可能与线程问题有关…任何解释都会受到赞赏)