1 votes

Comment passer à un sous-processus python créé par IPython (sous OS X) ?

Lorsque j'utilise IPython avec le -wthread il génère un sous-processus python, qui apparaît comme une application Mac OS X.

Mon problème est que lorsque j'envoie des commandes à cette application (par exemple, le traçage avec l'option matplotlib ), la fenêtre est mise à jour derrière toutes mes autres fenêtres. J'aimerais pouvoir appeler une commande python pour faire passer cette fenêtre python au premier plan (je le fais manuellement avec ⌘-tab, mais je dois d'abord trouver l'application python, et il peut y en avoir plusieurs).

Existe-t-il un script python pour détecter quelle application IPython a été lancée, et comment passer automatiquement à celle-ci sous OS X ?

(J'expose le problème sous OS X, mais le problème devrait être similaire sur d'autres systèmes).

Edit : laissez-moi décomposer ce problème en deux :

  1. comment savoir dans quelle application Mac OS X python est exécuté ? (probablement possible avec un peu de magie d'IPython)
  2. comment dire à Mac OS X de mettre le focus sur cette application ? (peut-être en utilisant applescript)

1voto

Sleepingrock Points 387

Ça pourrait être l'un ou l'autre :

  1. Faire un nouveau script python qui suit les processus petits-enfants d'un autre script pourrait être délicat. La documentation d'IPython a un exemple pour surveiller les processus spawnés par pid ; JobControl . JobControl ne tue que les processus mais j'imagine que l'ajout d'une commande pour changer le focus de la fenêtre serait assez facile.

  2. D'après ce que j'ai lu, le gui Tk ne définit pas correctement le focus de la fenêtre sur les macs. Si votre 'matplotlib' ou autre utilise le gui Tk, ceci peut être le problème. - _fuente -_

Je ne suis pas très familier avec l'OS X, alors faites avec, clarifiez votre situation ou faites-moi savoir si je suis trop loin.

1voto

Olivier Verdier Points 12332

Voici ma solution complète, avec une fonction magique IPython.

Installer appscript (véase cette question sur le changement d'application par programme dans OS X), et mettez le code suivant dans un script appelé activate.py dans votre ~/.ipython dossier.

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

Maintenant, modifiez votre ~/.ipython/ipy_user_conf.py et définir la fonction magique :

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)])

Il ne vous reste plus qu'à enregistrer cette fonction magique d'IPython en plaçant le texte suivant quelque part dans ce même fichier de configuration :

ip.expose_magic('wxactivate', wxactivate)

Maintenant, après avoir exécuté IPython -wthread vous pouvez appeler %wxactivate et vous passerez à l'application Python correspondante !

(notez que la raison pour laquelle il faut exécuter l'appel à la fonction d'appscript activate() dans un autre processus Je ne comprends pas bien le problème ; il s'agit peut-être d'un problème d'enfilage... toute explication serait appréciée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X