2014-11-02 16 views
5

sto usando Spyder 2.3.1 su Windows 7 e ho un kernel iPython 2.3 in esecuzione su un sistema operativo Linux RASPBIAN Rasperry Pi.Spyder: Come modificare uno script python localmente ed eseguirlo su un kernel remoto?

posso connettersi a un kernel esterna, utilizzando un file .json e questo tutorial: Remote ipython console

Ma che cosa ora? Se io "run" uno script (F5), quindi il kernel cerca di exectue lo script come:

%run "C:\test.py" 

ERRORE: Il file u'C:\\test.py' non trovato.

Questo torna con un errore, ofc, perché lo script giace sulla mia macchina in c: e non sulla macchina remota/raspberry pi. Come posso dire a Spyder di copiare in qualche modo prima lo script sulla macchina remota ed eseguirlo lì?

Se si seleziona la casella di controllo "questo è un kernel remoto", non riesco più a connettersi al kernel esistente. Cosa significa quella scatola? Copierà lo script tramite SSH sulla macchina remota prima dell'esecuzione? Se inserisco le informazioni di accesso SSH, viene visualizzato un errore "Sembra che il kernel sia morto in modo imprevisto".

risposta

2

Il tutorial che hai menzionato è un po 'datato dato che ora Spyder ha la possibilità di connettersi ai kernel remoti. La casella di controllo "Questo è un kernel remoto", se selezionata, abilita la parte della finestra di dialogo in cui è possibile immettere le credenziali di connessione ssh. (Avresti bisogno di questo a meno che non hai aperto manualmente i tunnel ssh necessari per inoltrare le porte di processo del tuo kernel remoto ...)

Inoltre, le informazioni di connessione ipython (il file json) devono corrispondere al kernel remoto, correndo sul tuo lampone pi.

Infine, al momento non è possibile copiare lo script sul PC locale quando si preme run. Il metodo preferito sarebbe in realtà il contrario: monta il tuo filesystem di Raspberry Pi usando uno strumento come sshfs e modificali sul posto. Il piano è di implementare un client sftp in Spyder in modo che non sia necessario e sarete in grado di esplorare il filesystem remoto dal file explorer di Spyder.

In sintesi:

1) partendo dal presupposto che si è connessi in pi lampone, lanciare un kernel IPython locale con kernel ipython. Dovrebbe darti il ​​nome del tuo file json da usare, che dovresti copiare sul tuo pc locale.

2) in spyder sul PC locale, la connessione a un kernel a distanza con quel file JSON e le credenziali ssh

So che è ingombrante, ma è un primo passo ..

+0

Quindi, diciamo che mi connetto attraverso un file json già esistente al kernel iPython sulla macchina remota. Funziona già senza la casella "Questo è un kernel remoto". ** Perché devo inserire credenziali SSH? Spider avrebbe fatto il login nel mio lampone e avviato un kernel ipython lì e recuperare il file json per me? ** Ho usato samba per essere in grado di caricare lo script dalla directory home di rasperry pi. Quindi connesso a un kernel. Così posso modificare il file localmente, quindi tab nella console ipython e manualmente "run xyz.py" (senza F5). Bene, questo dovrebbe funzionare Grazie! – venti

+0

Se si utilizza una connessione SSH senza password, non è necessario selezionare la casella * This is a kernel remote *. Presumo che sia il tuo setup perché altrimenti non capisco come ti connetti al tuo rasperry pi. In ogni caso, la funzionalità è lì per aiutare gli utenti ad aprire i tunnel ssh in modo che possano connettersi automaticamente ai kernel in altre macchine. Ma se non ne hai bisogno, non devi preoccuparti di questo. –

1

altro l'opzione è usare le celle Spyder per inviare l'intero contenuto del tuo file alla console IPython. Penso che sia più facile che montare il tuo filesystem remoto con Samba o sshfs (nel caso non sia possibile o difficile da fare).

Le celle sono definite aggiungendo linee del modulo # %% al file.Per esempio, diciamo che il file è:

# -*- coding: utf-8 -*- 

def f(x): 
    print(x + x) 

f(5) 

allora si può solo aggiungere una cella in fondo come questo

# -*- coding: utf-8 -*- 

def f(x): 
    print(x + x) 

f(5) 

# %% 

e premendo Ctrl + Inserisci al di sopra della linea cellulare, l'intero contenuto del file verrà inviato alla console e valutato immediatamente.

+0

Cool !, non lo sapevo. Lavoro. Sfortunatamente ho riscontrato che non puoi STRG + C un kernel remoto. Nella mia applicazione eseguo un'animazione su alcune strisce LED esterne a tempo indeterminato. Se premi STRG + C spyder ti dice "--------------------------- IPython ---------- ----------------- Il processo del kernel è remoto o non specificato. Impossibile interrompere --------------------- ------ OK --------------------------- "Così cambierò il programma in un ciclo finale dopo aver scritto alcuni cicli con il pin PWM GPIO di Raspberry. – venti

+1

Sì, non è possibile interrompere i kernel esterni in questo momento. Vedi questo [problema IPython] (https://github.com/ipython/ipython/issues/1004) per qualche discussione a riguardo. –

2

Dopo una ricerca nella directory site-packages\spyderlib per la parola chiave %run, ho trovato il metodo (in site-packages\spyderlib\plugins\ipythonconsole.py), che costruisce il comando %run:

def run_script_in_current_client(self, filename, wdir, args, debug): 
    """Run script in current client, if any""" 
    norm = lambda text: remove_backslashes(to_text_string(text)) 
    client = self.get_current_client() 
    if client is not None: 
     # Internal kernels, use runfile 
     if client.kernel_widget_id is not None: 
      line = "%s('%s'" % ('debugfile' if debug else 'runfile', 
           norm(filename)) 
      if args: 
       line += ", args='%s'" % norm(args) 
      if wdir: 
       line += ", wdir='%s'" % norm(wdir) 
      line += ")" 
     else: # External kernels, use %run 
      line = "%run " 
      if debug: 
       line += "-d " 
      line += "\"%s\"" % to_text_string(filename) 
      if args: 
       line += " %s" % norm(args) 
     self.execute_python_code(line) 
     self.visibility_changed(True) 
     self.raise_() 
    else: 
     #XXX: not sure it can really happen 
     QMessageBox.warning(self, _('Warning'), 
      _("No IPython console is currently available to run <b>%s</b>." 
       "<br><br>Please open a new one and try again." 
      ) % osp.basename(filename), QMessageBox.Ok) 

ho aggiunto il seguente codice per convertire i percorsi dopo else: # External kernels, use %run

  # ----added to remap local dir to remote dir------- 
      localpath = "Z:\wk" 
      remotepath = "/mnt/sdb1/wk" 
      if localpath in filename: 
       # convert path to linux path 
       filename = filename.replace(localpath, remotepath) 
       filename = filename.replace("\\", "/") 
      # ----- END mod 

ora esegue il file sul computer remoto quando si preme F5. Sono su Spyder 2.3.9 con condivisione samba mappata su z: drive.

+0

Potete fornire maggiori dettagli? Quando si preme F5, sembra che Windows Spyder proverà a copiare il codice dalla macchina remota ed eseguirlo su Windows? Non è necessario aprire una connessione SSH per inviare effettivamente il comando di esecuzione all'host remoto? – MichaelSB

+0

Ho impostato lo spyder per connettersi a un kernal ipython remoto usando il file json come menzionato da op, quando viene colpito f5, spyder invia '% run filepath' al kernal ipython, op ha l'errore si verifica perché nessun filepath non esiste sul computer remoto, ho mappato la condivisione di file samba su z: unità in modo che il telecomando abbia –

+0

seconda parte (mi dispiace, ho colpito per sbaglio invio) la macchina remota ha lo stesso file (prima che il comando venga inviato, spyder salva anche il file), il codice nella mia risposta traduce il percorso file locale in percorso file remoto. Per quanto riguarda la seconda domanda, non penso che ssh sia necessario, comunque uso l'opzione ssh in spyder ma penso che faccia solo port forwarding (perché ho un firewall sulla macchina remota). –