Come passare a un sottoprocesso pitone creato da IPython (su OS X)?
Domanda
Quando uso IPython insieme con l'opzione -wthread
, si genera un sottoprocesso pitone, che appare come un'applicazione per Mac OS X.
Il mio problema è che quando trasmetto comandi per tale applicazione (ad esempio la stampa con matplotlib
), la finestra viene aggiornata alle spalle tutti i miei altre finestre. Mi piacerebbe essere in grado di chiamare un comando python per passare questa finestra di pitone per la parte anteriore (I farlo manualmente con ⌘-Tab, ma devo trovare l'applicazione pitone prima, e ci potrebbero essere diversi quelli).
C'è uno script python per rilevare quale applicazione IPython ha generato, e come poi passare automaticamente ad esso in OS X?
(sto affermando il problema in OS X, ma la questione dovrebbe essere simile su altri sistemi).
Edit: mi permetta di scomposizione in due problemi:
- come sapere che python applicazione per Mac OS X è in esecuzione in? (Probabilmente possibile con una certa IPython stregoneria)
- come dire Mac OS X per mettere l'accento su tale domanda? (Magari usando AppleScript)
Soluzione 2
Questa è la mia soluzione completa, con una funzione di magia IPython.
appscript (vedi this di passare le applicazioni a livello di codice in OS X), e inserire il seguente codice in uno script chiamato activate.py
nella cartella ~/.ipython
.
import appscript
import sys
appscript.app(pid=int(sys.argv[1])).activate()
Ora, modificare il file di configurazione ~/.ipython/ipy_user_conf.py
e definire la funzione magica:
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)])
Ora non resta che registrare questa funzione magica IPython mettendo il seguente da qualche parte nello stesso file di configurazione:
ip.expose_magic('wxactivate', wxactivate)
Ora, dopo aver eseguito IPython -wthread
, è possibile chiamare %wxactivate
e si passa alla applicazione Python corrispondente!
(si noti che il motivo per cui si deve eseguire la chiamata a activate()
di appscript in un altro processo in non chiaro per me, ma potrebbe avere a che fare con qualche problema di threading ... ogni spiegazione sarebbe appreciatated)
Altri suggerimenti
Potrebbe essere:
-
Fare un nuovo script python che tiene traccia dei processi nipote di un altro script potrebbe essere difficile. La documentazione IPython ha un esempio per monitorare processi generati da pid; JobControl . JobControl uccide solo i processi ma immagino che l'aggiunta di un comando per modificare la finestra di messa a fuoco sarebbe stato abbastanza facile.
-
Da quello che ho letto, l'interfaccia grafica Tk non impostato correttamente finestra concentrarsi su Mac. Se il 'matplotlib' o comunque utilizza la GUI Tk, questo può essere il problema. - fonte -
Io non sono molto familiare con OS X, quindi o correre con quelli, chiarire la vostra situazione o fatemi sapere se sono troppo lontano.