2014-11-02 13 views
5

Używam Spyder 2.3.1 pod Windows 7 i mam działające jądro iPython 2.3 na Rasperry Pi RASPBIAN Linux OS.Spyder: Jak edytować skrypt Pythona lokalnie i wykonać go na zdalnym jądrze?

mogę połączyć się z jądra zewnętrznego, przy użyciu pliku .json i ten tutorial: Remote ipython console

ale co teraz? Gdybym "run" skrypt (F5), wtedy jądro próbuje exectue skrypt jak:

%run "C:\test.py" 

ERROR: File u'C:\\test.py' nie została znaleziona.

Powraca z błędem ofc, ponieważ skrypt leży na mojej maszynie pod c: a nie na zdalnym komputerze/raspberry pi. Jak mogę powiedzieć Spyderowi, aby jakoś skopał najpierw skrypt do zdalnego komputera i tam go wykonał?

Jeśli zaznaczę pole "to jest zdalne jądro", nie mogę już połączyć się z istniejącym jądrem. Co to oznacza? Czy przed wykonaniem skrypt skopiuje skrypt przez SSH na zdalną maszynę? Po wprowadzeniu informacji logowania SSH otrzymuję komunikat o błędzie "Wygląda na to, że jądro zginęło nieoczekiwanie".

Odpowiedz

2

Samouczek, o którym wspominasz, jest trochę aktualny, ponieważ Spyder ma teraz możliwość łączenia się ze zdalnymi jądrami. Pole wyboru "To jest zdalne jądro", jeśli jest zaznaczone, włącza część okna dialogowego, w którym można wprowadzić swoje poświadczenia połączenia ssh. (Powinieneś tego potrzebować, chyba że ręcznie otworzyłeś wymagane tunele ssh, aby przesłać porty procesowe swojego zdalnego jądra ...)

Poza tym informacje o połączeniu ipython (plik json) muszą odpowiadać zdalnemu jądrowi, biegasz po twoim malinowym pi.

Wreszcie, nie ma w tej chwili możliwości skopiowania skryptu leżącego na lokalnym komputerze po uruchomieniu. Preferowana metoda byłaby odwrotna: zamontuj system plików raspberry pi za pomocą narzędzia takiego jak sshfs i zmodyfikuj je na miejscu. Plan jest taki, aby zaimplementować klienta sftp w Spyderze, aby nie był on wymagany i będziesz mógł eksplorować zdalny system plików z eksploratora plików Spydera.

Podsumowując:

1) przy założeniu, że użytkownik jest zalogowany w Raspberry Pi, uruchomienie lokalnego jądra ipython z jądra ipython. Powinien podać nazwę używanego pliku json, który powinieneś skopiować na lokalny komputer.

2) w Spyder na lokalnym komputerze, połączyć się ze zdalnym jądra z tego pliku json i poświadczenia ssh

wiem, że jest to uciążliwe, ale to jest pierwszy krok ..

+0

Powiedzmy, że łączę się poprzez istniejący już plik json z jądrem iPython na zdalnym komputerze. Działa to już bez pola wyboru "To jest zdalne jądro". ** Dlaczego muszę wprowadzić dane uwierzytelniające SSH? Czy Spider następnie zaloguje się do mojej maliny i uruchomi jądro ipython i pobierze dla mnie plik json? ** Użyłem samby, aby załadować skrypt z katalogu domowego piszczera pi. Następnie podłączony do jądra. Mogę więc edytować plik lokalnie, a następnie przejść do konsoli ipython i ręcznie "uruchomić xyz.py" (bez F5). To powinno działać. Dzięki! – venti

+0

Jeśli korzystasz z połączenia SSH bez użycia hasła, nie musisz zaznaczać pola * To jest zdalne jądro *. Zakładam, że to twoja konfiguracja, ponieważ w przeciwnym razie nie rozumiem, jak łączycie się ze swoim raspernym pi. W każdym razie funkcjonalność jest dostępna, aby pomóc użytkownikom w otwarciu tuneli ssh, aby mogli automatycznie łączyć się z jądrem na innych komputerach. Ale jeśli go nie potrzebujesz, nie musisz się tym martwić. –

1

Innym opcja polega na użyciu komórek Spyder do przesłania całej zawartości pliku do konsoli IPython. Myślę, że jest to łatwiejsze niż zamontowanie zdalnego systemu plików za pomocą Samby lub sshfs (w przypadku, gdy nie jest to możliwe lub trudne).

Komórki definiuje się, dodając do pliku wiersze formularza # %%.Na przykład, powiedzmy, że plik jest:

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

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

f(5) 

Następnie można po prostu dodać komórkę na dole jak to

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

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

f(5) 

# %% 

i naciskając Ctrl + Wprowadź powyżej linii komórkowej, pełna zawartość twojego pliku zostanie wysłana do konsoli i oceniona od razu.

+0

Cool !, nie wiedziałem tego. Pracuję. Niestety napotkałem, że nie możesz STRG + C zdalnym jądrem. W mojej aplikacji uruchamiam animację na jakimś zewnętrznym pasku LED w nieskończoność. Jeśli naciśniesz STRG + C spyder mówi "-------------------------------------------------------------------- IPython ---------- ----------------- Proces jądra jest zdalny lub nieokreślony Nie można przerwać --------------------- ------ OK --------------------------- "Tak więc po zapisaniu zmienię program na końcową pętlę niektóre cykle ze szpilką PWIO Raspberry's GPIO. – venti

+1

Tak, nie można teraz przerwać jądra zewnętrznego. Zobacz ten [problem z IPythonem] (https://github.com/ipython/ipython/issues/1004), aby porozmawiać na ten temat. –

2

Po wyszukiwaniu w katalogu site-packages\spyderlib dla słowa kluczowego %run, znalazłem sposób (w site-packages\spyderlib\plugins\ipythonconsole.py), który konstruuje polecenia %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) 

I dodaje następujący kod do konwertowania ścieżek po 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 

teraz uruchamia plik na zdalnym komputerze po naciśnięciu klawisza F5. Jestem na Spyder 2.3.9 z udziałem Samby zmapowanym na dysku z :.

+0

Czy możesz podać więcej szczegółów? Po naciśnięciu klawisza F5 wydaje się, że system Windows Spyder spróbuje skopiować kod ze zdalnego komputera i wykonać go w systemie Windows? Czy nie musisz otwierać połączenia SSH, aby wysłać komendę wykonawczą do zdalnego hosta? – MichaelSB

+0

Ustawiam spyder, aby połączyć się ze zdalnym kernalem ipython za pomocą pliku json, jak wspomniano przez op, gdy f5 zostanie trafiony, spyder wysyła '% run filepath' do ipython kernal, op ma błąd, ponieważ nie ma ścieżki do pliku istnieje na zdalnym komputerze, zamapowałem udział plików Samby na napęd z: tak, aby pilot miał –

+0

2. część (przepraszam, przypadkowo trafiłem przesłanie) zdalna maszyna ma ten sam plik (zanim komenda zostanie wysłana, spyder również zapisze plik), kod w mojej odpowiedzi tłumaczy lokalną ścieżkę do zdalnej ścieżki do plików. Jeśli chodzi o drugie pytanie, nie uważam, że ssh jest konieczne, jednak używam opcji ssh w spyderze, ale myślę, że to tylko przekazuje port (ponieważ mam firewall na zdalnym komputerze). –

Powiązane problemy