2016-09-02 17 views
11

Tôi đã sử dụng sổ ghi chép jupyter để phân tích dữ liệu trong một thời gian dài. Tôi muốn phát triển một mô-đun trong thư mục sổ ghi chép jupyter của mình và có thể nhập mô-đun mới đó vào sổ ghi chép. Thư mục tệp sổ tay jupyter của tôi có thể được biểu diễn như sau;Làm cách nào để nhập mô-đun trong thư mục sổ tay jupyter vào sổ ghi chép trong các thư mục dưới?

Jupyter notebooks\ 

    notebook1.ipynb 

    new_module\ 
     __init__.py 
     newfunction.py 

    currentnotebooks\ 
     notebook2.ipynb 

Khi sử dụng import new_module trong notebook1.ipynb nó hoạt động tuy nhiên khi tôi thử các lệnh tương tự trong notebook2.ipynb tôi nhận được sau ImportError: No module named 'new_module'. Hai giải pháp rõ ràng là A) di chuyển new_module vào thư mục currentnotebooks hoặc B) di chuyển notebook2.ipynb lên cùng cấp như new_module. Tôi không muốn lộn xộn xung quanh với cấu trúc tập tin ở tất cả. Điều này có thể không?

+0

Nếu bạn đặt 'new_module' vào một trong các thư mục được liệt kê trong' sys.path', nó sẽ có thể nhập từ bất kỳ đâu. –

Trả lời

15

Bạn cần đảm bảo rằng thư mục mẹ của new_module nằm trên đường dẫn python của bạn. Đối với một máy tính xách tay đó là một cấp dưới new_module, mã này sẽ làm các trick:

import os 
import sys 
nb_dir = os.path.split(os.getcwd())[0] 
if nb_dir not in sys.path: 
    sys.path.append(nb_dir) 

Nếu bạn tiếp tục xuống trong hệ thống phân cấp thư mục, bạn sẽ cần phải điều chỉnh cách nb_dir được thiết lập, nhưng đó là tất cả. Bạn nên không chạy mã này cho sổ ghi chép trong Jupyter notebooks, vì nó sẽ thêm phụ huynh của thư mục đó vào đường dẫn python, có thể là không mong muốn.

Lý do thao tác nhập cho notebook1 là sys.path chứa '' (chuỗi rỗng), là thư mục hiện tại của trình thông dịch đang chạy (hạt nhân, trong trường hợp này). Tìm kiếm google explain python path sẽ giải thích một số cách tốt về cách python sử dụng PYTHONPATH (aka sys.path).

+0

Vì vậy, tôi luôn luôn phải làm mã đề xuất của bạn boilerplate trước khi tôi có thể truy cập các mô-đun khác ngay cả khi họ chỉ là một thư mục ở trên? Không có cách nào khác phù hợp để đạt được điều này, ví dụ: thông qua nhập khẩu tương đối? (mặc dù tôi phải thừa nhận rằng tôi vẫn không chắc chắn về cách hoạt động của việc nhập khẩu tương đối) –

+1

Nhiều hơn hoặc ít hơn. Trường hợp ngoại lệ sẽ là nếu thư mục gốc là một mô-đun (và vì vậy có một tập tin ''init __. Py'), nhưng điều đó có vẻ lạ và khó xảy ra với tôi. Đặt thư mục sổ tay trong 'PYTHONPATH' sẽ tránh sự cần thiết phải thêm nó vào sys.path theo cách này. – cco

Các vấn đề liên quan