[PYTHON] Importer des cellules spécifiques à partir d'autres blocs-notes avec le bloc-notes Jupyter

introduction

Lorsque vous analysez des données ou que vous testez des blocs-notes Jupyter, vous souhaitez souvent importer des cellules spécifiques à partir d'autres blocs-notes qui définissent des classes à analyser. Voici deux méthodes qui pourraient fonctionner.

1. Commande magique %% writefile

Le moyen le plus simple est d'utiliser la commande magique %% writefile. Le contenu de la cellule est copié dans «filename» en définissant «%% writefile filename» au début de la cellule. Il ne vous reste plus qu'à importer le nom de fichier d'un autre notebook.

Cellule que vous souhaitez lire à partir d'un autre bloc-notes


%%writefile hoge.py
class Hoge:
    def __init__(self):
        print('Hello from Hoge')

Lire et utiliser le contenu d'autres cellules de bloc-notes de sortie


import hoge

x = hoge.Hoge()

2. Faites de votre mieux pour créer le vôtre

Officiel dit: "Tout le monde veut le faire, et ils n'ont pas à s'en soucier avec juste une API publique. S'il dit "Je peux le faire!", Je veux que vous puissiez le faire avec une seule commande ~~, donc je vais le faire moi-même en me référant au code lié [^ t dual].

[^ tdual]: @tdual a écrit article sur le contenu du lien. Après enquête, le code publié dans l'article de @ tdual (c'est-à-dire le code officiellement introduit) semble être mélangé avec du code hérité qui est obsolète depuis Python 3.4, donc modcell a apporté quelques modifications. ____ Est à l'intérieur. Si modcell ne fonctionne pas à cause de la version, vous devriez essayer le code de @ tdual.

Le code lié exécutera toutes les cellules de code du bloc-notes chargées en tant que module, essayez donc de le modifier pour que la cellule avec # modcell dans le commentaire au début de la cellule de code soit identifiée et chargée. C'était.

Veuillez l'utiliser si vous le souhaitez car il a été publié sous la forme d'une bibliothèque appelée modcell.

(Si vous le cherchez, il devrait y avoir des gens qui font des bibliothèques intelligentes que moi, donc si quelqu'un connaît une bonne bibliothèque, je vous serais reconnaissant si vous pouviez me le faire savoir.)

Usage modcell recherche les fichiers avec l'extension .ipynb qui existent dans le répertoire enregistré dans sys.path, et est écrit dans la première ligne (à l'exclusion des commandes magiques) de la cellule de code. Identifie le commentaire # modcell et l'importe en tant que module.

Installation

pip install modcell

Importer modcell

L'importation du module modcell ajoute un chargeur à sys.meta_path pour charger le .ipynb. Après cela, il sera possible d'importer des fichiers avec l'extension .ipynb.

import modcell as mods

Importer un fichier .ipynb

L'importation avec un nom sans l'extension, tout comme un module normal, importera toutes les cellules avec # modcell au début de la cellule (à l'exception de la commande magique IPython).

Cahier du côté importé(test_module.ipynb)Une certaine cellule


# modcell
class TestModule:
    def __init__(self):
        pass

    def hello(self):
        print('Hello from TestModule')

Une certaine cellule dans le cahier du côté importation


import test_module as mod

x = mod.TestModule()
x.hello()

modcell ignore les commandes magiques IPython (les lignes commençant par! ʻOr%`). En d'autres termes, «% autoreload» et «%% time» ne seront pas exécutés lors de l'importation par «modcell».

De plus, je ne sais pas si modcell lui-même prend en charge% autoreload parce que je ne l'ai pas testé. Nous avons confirmé que si vous faites "Redémarrer et exécuter tout", les autres notebooks seront rechargés.

compiler

Compatibilité ascendante avec %% writefile. Sort toutes les cellules importées dans un fichier.

import modcell as mods
import test_module

with open('module.py', mode='w') as f:
    mods.compile(out=f, source_info=True)

Il est formaté comme suit.

module.py


# test_module.ipynb ---------
# ---

class TestModule:
    def __init__(self):
        pass
    
    def hello(self):
        print('Hello from TestModule')

# ---
# --------- test_module.ipynb

Le commentaire délimité correspondant à la cellule est sorti du point de vue du débogage, etc., mais s'il est gênant, il ne sera pas affiché si source_info = False est spécifié.

Importez uniquement les cellules avec des balises spécifiques à partir de .ipynb

Ecrire un commentaire au début de la cellule

test_module.Une certaine cellule d'ipynb


# modcell: tagname
class TestModule:
    def __init__(self):
        pass

    def hello(self):
        print('Hello from TestModule')

Vous ne pouvez ajouter qu'une seule balise à chaque cellule en utilisant la syntaxe de. Lors de l'importation

import modcell as mods

mod = mods._import('test_module', tag='tagname')

x = mod.TestModule().hello()

Ce faisant, seules les cellules avec la balise «tagname» peuvent être lues.

Compiler vers plusieurs fichiers de module

Par défaut, modcell crée une instance de la classe modcell.ModCell, et toutes les fonctions sont exécutées en tant que méthodes de cette instance par défaut. Cette instance par défaut peut être obtenue avec la fonction modcell.default (), mais elle n'est pas recommandée pour l'interaction de l'utilisateur.

Les utilisateurs peuvent créer plusieurs instances ModCell selon leurs besoins.

import modcell as mods

mod_1 = mods.ModCell()
mod_2 = mods.ModCell()
...

En d'autres termes, vous pouvez générer plusieurs fichiers .py à partir de plusieurs .ipynb en exécutant le code suivant.

import modcell as mods

mod_debug = mods.ModCell()
nb1_debug = mod_debug._import('notebook_1', tag='debug')
nb2 = mod_debug._import('notebook_2')
nb3 = mod_debug._import('notebook_3')
with open('../module/mod_debug.py', mode='w') as f:
    mod_debug.compile(out=f)

mod_test = mods.ModCell()
nb1_test = mod_test._import('notebook_1', tag='test')
nb4 = mod_test._import('notebook_4')
with open('../module/mod_test.py', mode='w') as f:
    mod_test.compile(out=f)

prime

Une autre méthode que j'ai proposée était "Attacher au noyau IPython et extraire le contenu des cellules de code d'autres notebooks", mais il semble que le contenu des cellules de code soit conservé par le JavaScript frontal. Cependant, le noyau IPython semble ne contenir que le code après l'analyseur, donc c'était une mauvaise idée.

https://stackoverflow.com/questions/51121647/get-the-current-contents-of-the-entire-jupyter-notebook

Recommended Posts

Importer des cellules spécifiques à partir d'autres blocs-notes avec le bloc-notes Jupyter
Utilisation de Graphviz avec Jupyter Notebook
Utiliser pip avec Jupyter Notebook
Utiliser Cython avec Jupyter Notebook
Jouer avec Jupyter Notebook (IPython Notebook)
Gestion des serveurs avec import Jupyter (1)
Autoriser les connexions externes avec le notebook Jupyter
Formatage avec autopep8 sur le notebook Jupyter
Visualisez l'arbre de décision avec le notebook Jupyter
Faites un son avec le notebook Jupyter
Utiliser Markdown avec le notebook Jupyter (avec raccourci)
Ajouter plus de noyaux avec Jupyter Notebook
Analyse pratique avec Pandas + notebook Jupyter
Paramètres de lecture de fichiers S3 avec des pandas depuis Jupyter Notebook sur AWS
Utiliser nbextensions avec le notebook Jupyter d'Anaconda
Utilisation d'Apache Spark avec le notebook Jupyter (notebook IPython)
Je veux écrire un blog avec Jupyter Notebook
Utiliser Jupyter Lab et Jupyter Notebook avec EC2
Essayez SVM avec scikit-learn sur Jupyter Notebook
Utilisez BigQuery à partir de votre bloc-notes Jupyter local
Pour importer votre propre module avec jupyter
Comment utiliser le notebook Jupyter avec ABCI
Lier Python et JavaScript avec le notebook Jupyter
[Mémo Jupyter Notebook] Afficher les kanji avec matplotlib
Sortie de cellule riche avec Jupyter Notebook (IPython)
Utilisez le notebook Jupyter en vous connectant depuis un autre hôte
Comment déboguer avec Jupyter ou iPython Notebook
Construire un environnement d'analyse avec Docker (jupyter notebook + PostgreSQL)
Analyse des données pour améliorer POG 2 ~ Analyse avec le notebook jupyter ~
Activer Jupyter Notebook avec conda sur un serveur distant
Convertissez facilement les notebooks Jupyter en blogs avec Fastpages
Essayez d'utiliser l'environnement virtuel conda avec Jupyter Notebook
Remplissez la largeur du bloc-notes Jupyter pour remplir le navigateur
Télécharger en masse des images à partir d'une URL spécifique avec python
Dessin graphique avec jupyter (notebook ipython) + matplotlib + vagrant