web-dev-qa-db-fra.com

Comment importer un module dans le répertoire des ordinateurs portables Jupyter dans des ordinateurs portables des répertoires inférieurs?

J'ai utilisé jupyter notebook pour l'analyse des données pendant un bon bout de temps. J'aimerais développer un module dans mon répertoire de cahiers jupyter et pouvoir importer ce nouveau module dans des cahiers. Le répertoire de fichiers de mon cahier jupyter peut être représenté comme suit:

Jupyter notebooks\

    notebook1.ipynb

    new_module\
        __init__.py
        newfunction.py

    currentnotebooks\
        notebook2.ipynb

Quand utiliser import new_module dans notebook1.ipynb cela fonctionne cependant quand j'essaye la même commande dans notebook2.ipynb j'obtiens le suivant ImportError: No module named 'new_module'. Les deux solutions évidentes sont A) déplacez new_module dans le répertoire currentnotebooks ou B) déplacez notebook2.ipynb jusqu'au même niveau que new_module. Je ne veux pas du tout gâcher la structure des fichiers. Est-ce possible?

22
James Draper

Vous devez vous assurer que le répertoire parent de new_module est sur votre chemin python. Pour un ordinateur portable dont le niveau est inférieur à new_module, ce code fera l'affaire:

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

Si vous êtes plus bas dans la hiérarchie des répertoires, vous devrez ajuster la façon dont nb_dir est réglé, mais c'est tout. Vous devriez pas exécuter ce code pour un cahier dans Jupyter notebooks, car le parent de ce répertoire serait ajouté au chemin python), ce qui n’est probablement pas souhaitable.

La raison pour laquelle l'importation fonctionne pour notebook1 est-ce que sys.path contient '' (la chaîne vide), qui est toujours le répertoire actuel de l'interpréteur en cours d'exécution (kernel, dans ce cas). Une recherche google pour explain python path donne de bonnes explications sur la manière dont python utilise PYTHONPATH (aka sys.path).

37
cco