ipynb nhập tệp ipynb khác


91

Interactive Python (ipython) đơn giản là tuyệt vời, đặc biệt là khi bạn đang ghép mọi thứ lại với nhau một cách nhanh chóng ... và thực hiện nó theo cách dễ dàng quay lại.

Tuy nhiên, điều có vẻ thú vị là trường hợp sử dụng có nhiều sổ ghi chép ipython (tệp ipynb). Có vẻ như sổ ghi chép KHÔNG được cho là có mối quan hệ với các sổ ghi chép khác, điều này có lý, ngoại trừ việc tôi muốn nhập các tệp ipynb khác.

Cách giải quyết duy nhất mà tôi thấy là chuyển đổi các tệp * .ipynb thành các tệp * .py, sau đó có thể nhập tệp này vào sổ ghi chép của tôi. Có một tệp chứa mọi thứ trong một dự án hơi kỳ lạ, đặc biệt nếu tôi muốn thực sự thúc đẩy việc tái sử dụng mã (đó không phải là nguyên lý cốt lõi của python sao?).

Tui bỏ lỡ điều gì vậy? Đây không phải là trường hợp sử dụng được hỗ trợ của máy tính xách tay ipython? Có giải pháp nào khác mà tôi có thể sử dụng để nhập tệp ipynb này vào sổ ghi chép khác không? Tôi muốn tiếp tục sử dụng ipynb, nhưng nó thực sự làm xáo trộn quy trình làm việc của tôi ngay bây giờ :(



2
Bạn có thể khởi động máy chủ sổ ghi chép bằng --scriptđể lưu các bản sao .py của sổ ghi chép của mình. Trong IPython 2.0, bạn sẽ có thể %runghi chép. Chúng tôi vẫn đang tìm ra các cơ chế tốt hơn để sử dụng lại mã.
Thomas K

1
Ví dụ này cho thấy cách nhập sổ ghi chép IPython dưới dạng mô-đun mà không xuất bản sao dưới dạng tập lệnh.
minrk

Câu trả lời:


130

Nó thực sự đơn giản trong Jupyter mới hơn:

%run MyOtherNotebook.ipynb

5
% run MyOtherNotebook.ipynb đã thực hiện công việc cho tôi. (không '')
Florian H

6
Hãy cẩn thận, phương pháp này sẽ chạy hoàn toàn sổ ghi chép con. Bạn có thể thêm dấu kiểm __name__ == '__main__' and '__file__' not in globals()để xác minh xem bạn có đang ở trong sổ con không. (từ blog.sicara.com/… )
Flavian

8
% run 'MyOtherNotebook.ipynb' LỖI: root: u'MyOtherNotebook.ipynb.py'Không tìm thấy tệp .
user3673

1
@ Kocur4d Cảm ơn bạn đã sửa! Điều thú vị là nó đã hoạt động với tôi (với dấu ngoặc kép) khi tôi thử nó, nhưng các ví dụ trong tài liệu không có bất kỳ dấu ngoặc kép nào.
johndodo

3
nếu có ai đi qua đó, bạn cũng có thể sử dụng đường dẫn đầy đủ như% chạy "/path/to/my/file/notebook.ipynb"
Jeremie

33

Nếu bạn muốn nhập A.ipynbbằng B.ipynbvăn bản

import import_ipynb
import A

trong B.ipynb.

Các import_ipynbmô-đun Tôi đã tạo được cài đặt thông qua pip:

pip install import_ipynb

Nó chỉ là một tệp và nó tuân thủ nghiêm ngặt cách thức chính thức trên trang jupyter.

PS Nó cũng hỗ trợ những thứ như from A import foo, from A import *v.v.


@Crash pip install import-ipynbcũng hoạt động và cài đặt cùng một gói, nhưng vì python sẽ không cho phép bạn viết import import-ipynbvà coi đó chỉ là một tệp, pip install import_ipynbnên có vẻ phù hợp hơn với tôi.
axil

3
Có sự khác biệt nào giữa import nbimporterimport import_ipynb?
Fractale

1
Điều này hoàn toàn không hoạt động trong Jupyter của tôi với Python 3
Sebastialonso

@Sebastialonso Chính xác thì điều gì không hoạt động? Mô tả những gì bạn làm và những thông báo lỗi bạn thấy. Tốt nhất là mở một vé trên github.
trục

@axil Tôi gặp một lỗi tương tự trong đó nó không hoạt động với tôi trong Py3. Nó cung cấp cho tôi lỗi sau - ModuleNotFoundError: Không có mô-đun nào có tên 'A' PS: A.ipynb tồn tại trong cùng một thư mục
Soman Dubey

10

Chạy

!pip install ipynb

và sau đó nhập sổ ghi chép khác dưới dạng

from ipynb.fs.full.<notebook_name> import *

hoặc là

from ipynb.fs.full.<notebook_name> import <function_name>

Đảm bảo rằng tất cả các sổ ghi chép đều nằm trong cùng một thư mục.

Chỉnh sửa 1: Bạn có thể xem tài liệu chính thức tại đây - https://ipynb.readthedocs.io/en/stable/

Ngoài ra, nếu bạn chỉ muốn nhập các định nghĩa lớp & hàm từ sổ ghi chép (chứ không phải các câu lệnh cấp cao nhất), bạn có thể sử dụng ipynb.fs.defsthay thế ipynb.fs.full. Phép gán biến chữ hoa đầy đủ cũng sẽ được đánh giá.


Điều gì xảy ra nếu tên tệp của tôi có khoảng trắng trong đó?
Sameh

Bạn không nên giữ bất kỳ khoảng trắng nào trong tên tệp của mình
Malgo

2
Lưu ý rằng trong cả hai trường hợp được mô tả, sổ ghi chép đã nhập được thực thi đầy đủ. Các ipynbgói cũng hỗ trợ thực hiện một phần của chỉ định nghĩa. Đây là một gói chính thức của IPyhton, vì vậy tôi tin rằng đây phải là câu trả lời được chấp nhận.
amka66

Điều này có thể nhập sổ ghi chép bên trong một thư mục không? ví dụMyFolder/book.ipynb
bone225

Điều này trông có vẻ tốt nhưng bị lật khi gặp phải ví dụ% matplotlib inline ....
jtlz2

7

Cài đặt ipynb từ dấu nhắc lệnh của bạn

pip install import-ipynb

Nhập vào tệp sổ tay của bạn

import import_ipynb

Bây giờ hãy sử dụng lệnh nhập thông thường để nhập tệp của bạn

import MyOtherNotebook

Câu trả lời đơn giản nhất nhưng giải thích. Cảm ơn!
The Poor Do Thái

3

Bạn có thể sử dụng import nbimportersau đóimport notebookName


+1, nbimporter hoạt động giống như một sự quyến rũ đối với tôi, nó cũng có thể được cài đặt bằng cách sử dụng conda:conda install -c conda-forge importnb
Zuku

2

Các ý kiến ​​đề cập ở trên rất hữu ích nhưng chúng hơi khó thực hiện. Các bước dưới đây bạn có thể thử, tôi cũng đã thử và nó hoạt động:

  1. Tải xuống tệp đó từ sổ ghi chép của bạn ở định dạng tệp PY (Bạn có thể tìm thấy tùy chọn đó trong tab Tệp).
  2. Bây giờ sao chép tệp đã tải xuống đó vào thư mục làm việc của Jupyter Notebook
  3. Bây giờ bạn đã sẵn sàng để sử dụng nó. Chỉ cần nhập tệp .PY vào tệp ipynb

hmm ... Tôi đã chuyển đổi tệp callee.ipync thành tệp callee.py, sau đó tải tệp callee.py lên sổ ghi chép trong cùng một thư mục với caller.ipync và trong caller.ipync mà tôi vừa viết import callee, không thể công việc.
Elsa Lin

ps the IPython là phiên bản: 5.1.0.
Elsa Lin

1

Vấn đề là sổ ghi chép không phải là một tệp python thuần túy. Các bước để nhập .ipynbtệp được nêu trong phần sau: Nhập sổ ghi chép

Tôi đang dán mã, vì vậy nếu bạn cần ... bạn có thể sao chép và dán nhanh. Lưu ý rằng ở cuối tôi có import primescâu lệnh. Tất nhiên bạn sẽ phải thay đổi điều đó. Tên tệp của tôi là primes.ipynb. Từ thời điểm này, bạn có thể sử dụng nội dung bên trong tệp đó như bạn vẫn làm thường xuyên.

Ước gì có một phương pháp đơn giản hơn, nhưng điều này là trực tiếp từ tài liệu.
Lưu ý: Tôi đang sử dụng jupyter không phải ipython.

import io, os, sys, types
from IPython import get_ipython
from nbformat import current
from IPython.core.interactiveshell import InteractiveShell


def find_notebook(fullname, path=None):
    """find a notebook, given its fully qualified name and an optional path

    This turns "foo.bar" into "foo/bar.ipynb"
    and tries turning "Foo_Bar" into "Foo Bar" if Foo_Bar
    does not exist.
    """
    name = fullname.rsplit('.', 1)[-1]
    if not path:
        path = ['']
    for d in path:
        nb_path = os.path.join(d, name + ".ipynb")
        if os.path.isfile(nb_path):
            return nb_path
        # let import Notebook_Name find "Notebook Name.ipynb"
        nb_path = nb_path.replace("_", " ")
        if os.path.isfile(nb_path):
            return nb_path


class NotebookLoader(object):
    """Module Loader for Jupyter Notebooks"""
    def __init__(self, path=None):
        self.shell = InteractiveShell.instance()
        self.path = path

    def load_module(self, fullname):
        """import a notebook as a module"""
        path = find_notebook(fullname, self.path)

        print ("importing Jupyter notebook from %s" % path)

        # load the notebook object
        with io.open(path, 'r', encoding='utf-8') as f:
            nb = current.read(f, 'json')


        # create the module and add it to sys.modules
        # if name in sys.modules:
        #    return sys.modules[name]
        mod = types.ModuleType(fullname)
        mod.__file__ = path
        mod.__loader__ = self
        mod.__dict__['get_ipython'] = get_ipython
        sys.modules[fullname] = mod

        # extra work to ensure that magics that would affect the user_ns
        # actually affect the notebook module's ns
        save_user_ns = self.shell.user_ns
        self.shell.user_ns = mod.__dict__

        try:
        for cell in nb.worksheets[0].cells:
            if cell.cell_type == 'code' and cell.language == 'python':
                # transform the input to executable Python
                code = self.shell.input_transformer_manager.transform_cell(cell.input)
                # run the code in themodule
                exec(code, mod.__dict__)
        finally:
            self.shell.user_ns = save_user_ns
        return mod


class NotebookFinder(object):
    """Module finder that locates Jupyter Notebooks"""
    def __init__(self):
        self.loaders = {}

    def find_module(self, fullname, path=None):
        nb_path = find_notebook(fullname, path)
        if not nb_path:
            return

        key = path
        if path:
            # lists aren't hashable
            key = os.path.sep.join(path)

        if key not in self.loaders:
            self.loaders[key] = NotebookLoader(path)
        return self.loaders[key]

sys.meta_path.append(NotebookFinder())

import primes

1

Không có vấn đề gì khi sử dụng Jupyter với các mô-đun .py Python hiện có hoặc mới. Với Jupyter đang chạy, chỉ cần kích hoạt Spyder (hoặc bất kỳ trình soạn thảo nào bạn chọn) để xây dựng / sửa đổi định nghĩa lớp mô-đun của bạn trong tệp .py và sau đó chỉ cần nhập các mô-đun cần thiết vào Jupyter.

Một điều làm cho điều này thực sự liền mạch là sử dụng tiện ích mở rộng ma thuật tự động tải xuống. Bạn có thể xem tài liệu để tải tự động tại đây:

http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html

Đây là mã để tự động tải lại mô-đun bất kỳ khi nào nó được sửa đổi:

# autoreload sets up auto reloading of modified .py modules
import autoreload
%load_ext autoreload
%autoreload 2

Lưu ý rằng tôi đã thử mã được đề cập trong câu trả lời trước để mô phỏng tải tệp .ipynb dưới dạng mô-đun và làm cho nó hoạt động, nhưng nó bị kẹt khi bạn thực hiện thay đổi đối với tệp .ipynb. Có vẻ như bạn cần khởi động lại môi trường phát triển Jupyter để tải lại 'mô-đun' .ipynb, điều này không được chấp nhận đối với tôi vì tôi đang thực hiện nhiều thay đổi đối với mã của mình.


0

Hãy đảm bảo rằng bạn cũng thêm một __init__.pytệp trong gói chứa tất cả các tệp .ipynb khác của bạn.

Đây là ngoài liên kết nbviewer minrksyiđược cung cấp ở trên.

Tôi cũng gặp một số vấn đề tương tự và sau đó tôi đã viết giải pháp cũng như liên kết đến thư mục ổ đĩa google công cộng của tôi có một ví dụ hoạt động :)

Bài đăng Stackoverflow của tôi với thử nghiệm từng bước và Giải pháp:

Máy tính xách tay Jupyter: Nhập tệp .ipynb và truy cập phương pháp của tệp đó trong tệp .ipynb khác gây ra lỗi

Hy vọng điều này cũng sẽ giúp những người khác. Cảm ơn tất cả!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.