2016-09-02 35 views
11

Bir süredir veri analizi için jupyter notebook kullanıyorum. Jupyter notebook dizinimde bir modül geliştirmek ve yeni modülü notebook'lara aktarmak istiyorum. Jupyter defter dosya dizinim aşağıdaki gibi gösterilebilir;Jupyter notebook dizinindeki modülü alt dizinlerdeki not defterlerine nasıl alırım?

Jupyter notebooks\ 

    notebook1.ipynb 

    new_module\ 
     __init__.py 
     newfunction.py 

    currentnotebooks\ 
     notebook2.ipynb 

zaman ben ImportError: No module named 'new_module' şu olsun notebook2.ipynb aynı komutu çalıştığınızda bununla birlikte çalışır notebook1.ipynb kullanım import new_module. İki belirgin çözüm A) new_module'ı currentnotebooks dizinine taşıyor veya B) notebook2.ipynb'i new_module ile aynı seviyeye taşıyor. Dosya yapısıyla uğraşmak istemiyorum. Mümkün mü?

+0

'new_module'ü sys.path' içinde listelenen dizinlerden birine koyarsanız, her yerden içe aktarılabilir. –

cevap

15

new_module ana dizininin python yolunuzda olduğundan emin olmanız gerekir. new_module altında bir seviye olan bir notebook için bu kod işinizi görecektir: Eğer daha aşağıya dizin hiyerarşisinde iseniz

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

, sen nb_dir ayarlanır şekilde ayarlamak gerekir, ama hepsi bu. numaralı telefonu bu kodun Jupyter notebooks sürümünde bir defter için çalıştırmamalısınız, çünkü bu dizinin üst öğesini muhtemelen istenmeyen olan python yoluna ekler.

İçe aktarmanın notebook1 için çalışmasının nedeni, sys.path'in çalışan yorumlayıcının geçerli dizinini (bu durumda çekirdek) uzak olan '' (boş dizge) içermesidir. explain python path için yapılan bir google araması, python'un PYTHONPATH (aka sys.path) tarafından nasıl kullanıldığına dair birkaç iyi açıklamaya sahiptir.

+0

Bu yüzden, yukarıda sadece bir klasör olsalar bile diğer modüllere erişebilmem için önerilen boilerplate kodunu her zaman yapmak zorundayım? Bunu başarmanın başka bir yolu yok mu, örn. göreli ithalat yoluyla mı? (Ancak, göreceli ithalatların nasıl çalıştığından emin olmadığımı itiraf etmeliyim) –

+1

Az ya da çok. Üst dizin bir modül de olsaydı (ve böylece bir '__init __. Py' dosyası vardı), ancak bu benim için hem garip hem de olası görünmüyor olurdu. Notebook dizini 'PYTHONPATH 'içine koymak, bu şekilde sys.path dosyasına eklemenin gerekmesinden kaçınacaktır. – cco

İlgili konular