2017-02-10 22 views
10

Tôi đang làm việc trên Máy tính xách tay Python và tôi muốn rằng mã đầu vào lớn [đầu vào]đóng gói thành tệp [* .PY] và gọi tệp này từ sổ ghi chép.Cách thực thi tệp * .PY từ tệp * .IPYNB trên sổ ghi chép Jupyter?

Hành động chạy tệp [.PY] từ Notebook được tôi biết và lệnh khác nhau giữa Linux hoặc Windows. Nhưng khi tôi thực hiện hành động này và thực thi tệp [.PY] từ sổ ghi chép, nó không nhận ra bất kỳ thư viện hoặc biến nào được tải trong sổ ghi chép (giống như tệp [ .PY] bắt đầu từ số không ...) .

Có cách nào để sửa lỗi này không?

Một ví dụ đơn giản càng tốt của vấn đề sẽ được như sau:

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 

đâu "script.py" có nội dung sau:

plt.plot(x, f(x)) 
plt.xlabel("Eje $x$",fontsize=16) 
plt.ylabel("$f(x)$",fontsize=16) 
plt.title("Funcion $f(x)$") 
  • Trong vấn đề thực sự, tệp [* .PY] không có 4 dòng mã, nó có đủ hơn.
+0

biến 'x' của bạn là địa phương để file' .ipynb' của bạn, * không * tệp '.py' của bạn. Tệp '.py' không có ý tưởng về' x'. Tìm cách chuyển giá trị đó giữa các tập lệnh. Một cái gì đó như 'từ myfile.ipynb import x' (không biết nếu bạn có thể thực hiện kiểu nhập đó bằng các tệp' .ipynb', nhưng bạn có hiểu ý tôi không? – blacksite

+0

Cảm ơn bạn đã trả lời. Điều tôi muốn là máy tính xách tay không được mã hóa rất nhiều ... – JMSH

Trả lời

12

Trong %run magic documentation bạn có thể tìm thấy:

-i chạy tập tin trong namespace IPython thay vì một trống rỗng. Điều này rất hữu ích nếu bạn đang thử nghiệm với mã được viết trong một trình soạn thảo văn bản mà phụ thuộc vào các biến được định nghĩa tương tác.

Vì vậy, cung cấp -i hiện các trick:

%run -i 'script.py' 

"đúng" cách để làm điều đó

lẽ lệnh trên chỉ là những gì bạn cần, nhưng với tất cả sự chú ý mà câu hỏi này nhận được, tôi quyết định thêm một vài xu nữa cho câu hỏi đó cho những người không biết cách trông giống như thế nào hơn.
Giải pháp trên là một chút hacky, và làm cho mã trong các tập tin khác khó hiểu (Trường hợp này x biến đến từ đâu? Và chức năng f là gì?).

Tôi muốn chỉ cho bạn cách thực hiện mà không phải thực thi nhiều lần các tệp khác.
Chỉ cần biến nó thành một mô-đun với các hàm và lớp riêng của nó rồi nhập nó từ sổ ghi chép hoặc bàn điều khiển Jupyter của bạn. Điều này cũng có lợi thế là làm cho nó dễ dàng tái sử dụng và jupyters contextassistant có thể giúp bạn với autocompletion hoặc hiển thị cho bạn docstring nếu bạn đã viết một.
Nếu bạn liên tục chỉnh sửa tệp khác, thì autoreload sẽ giúp bạn.

dụ của bạn sẽ trông như thế này:
script.py

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 console

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

Có lẽ không phải là rất tao nhã, nhưng nó không được công việc:

exec(open("script.py").read()) 
Các vấn đề liên quan