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.
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()
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.
pip install 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
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.
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é.
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.
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)
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