2017-02-10 15 views
10

Pracuję na notebooku Python i chciałbym, aby duży kod wejściowy wprowadził do pakietu pliki [* .PY] i wydzwonił te pliki z notatnika.Jak wykonać plik * .PY z pliku * .IPYNB z notatnika Jupyter?

Działanie pliku [.PY] z Notatnika jest mi znane, a polecenie różni się w zależności od systemu Linux lub Windows. Ale kiedy wykonuję tę czynność i wykonuję plik [.PY] z notebooka, nie rozpoznaje ona żadnej istniejącej biblioteki ani zmiennej załadowanej do notebooka (to tak, jakby plik [ .PY] zaczął się od zera ...) .

Czy można to naprawić?

Możliwe uproszczony przykład problemu może być następujący:

In[1]: 
import numpy as np 
import matplotlib.pyplot as plt 

In[2]: 
def f(x): 
    return np.exp(-x ** 2) 

In[3]: 
x = np.linspace(-1, 3, 100) 

In[4]: 
%run script.py 

gdzie "script.py" ma następujące zawartości:

plt.plot(x, f(x)) 
plt.xlabel("Eje $x$",fontsize=16) 
plt.ylabel("$f(x)$",fontsize=16) 
plt.title("Funcion $f(x)$") 
  • W rzeczywistym problemem plik [* .PY] nie ma 4 linii kodu, ma wystarczająco dużo więcej.
+0

zmiennej x' 'jest lokalny do' .ipynb' pliku * nie * Twój plik '.py'. Plik '.py' nie ma pojęcia o' x'. Znajdź sposób przekazania tej wartości między skryptami. Coś w stylu 'from myfile.ipynb import x' (nie wiem, czy możesz dokonać tego typu importu z plikami' .ipynb', ale czy widzisz co mam na myśli? – blacksite

+0

Dziękuję za odpowiedź. notatnik nie jest bardzo mocno zakodowany ... – JMSH

Odpowiedz

12

W %run magic documentation można znaleźć:

-i uruchom plik w przestrzeni nazw ipython za Zamiast pusty. Jest to przydatne, jeśli eksperymentujesz z kodem napisanym w edytorze tekstu, który zależy od zmiennych zdefiniowanych interaktywnie.

Dlatego dostarczanie -i robi trick:

%run -i 'script.py' 

"poprawny" sposób to zrobić

Może powyższe polecenie jest tylko to, co trzeba, ale z cała uwaga to pytanie, postanowiłem dodać kilka dodatkowych groszy dla tych, którzy nie wiedzą, jak wyglądałby bardziej pytonowo.
Powyższe rozwiązanie jest nieco hackowate i sprawia, że ​​kod w innym pliku jest mylący (skąd pochodzi ta zmienna x? I jaka jest funkcja f?).

Chciałbym pokazać, jak to zrobić, bez konieczności wykonywania drugiego pliku w kółko.
Po prostu zamień go w moduł z własnymi funkcjami i klasami, a następnie zaimportuj z notebooka lub konsoli Jupyter. Ma to również tę zaletę, że można go łatwo ponownie wykorzystać, a kontekstowy asystent Jupitera może pomóc w autouzupełnianiu lub wyświetlać dokumentację, jeśli ją napisałeś.
Jeśli ciągle edytujesz drugi plik, przychodzi ci z pomocą autoreload.

Twój Przykładem może wyglądać następująco:
script.py konsola

import matplotlib.pyplot as plt 

def myplot(f, x): 
    """ 
    :param f: function to plot 
    :type f: callable 
    :param x: values for x 
    :type x: list or ndarray 

    Plots the function f(x). 
    """ 
    # yes, you can pass functions around as if 
    # they were ordinary variables (they are) 
    plt.plot(x, f(x)) 
    plt.xlabel("Eje $x$",fontsize=16) 
    plt.ylabel("$f(x)$",fontsize=16) 
    plt.title("Funcion $f(x)$") 

Jupyter

In [1]: import numpy as np 

In [2]: %load_ext autoreload 

In [3]: %autoreload 1 

In [4]: %aimport script 

In [5]: def f(x): 
     :  return np.exp(-x ** 2) 
     : 
     : 

In [6]: x = np.linspace(-1, 3, 100) 

In [7]: script.myplot(f, x) 

In [8]: ?script.myplot 
Signature: script.myplot(f, x) 
Docstring: 
:param f: function to plot 
:type f: callable 
:param x: x values 
:type x: list or ndarray 
File:  [...]\script.py 
Type:  function 
1

Może niezbyt eleganckie, ale spełnia swoje zadanie:

exec(open("script.py").read())