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:

  1. come sapere che python applicazione per Mac OS X è in esecuzione in? (Probabilmente possibile con una certa IPython stregoneria)
  2. come dire Mac OS X per mettere l'accento su tale domanda? (Magari usando AppleScript)
È stato utile?

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:

  1. 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.

  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top