À l'aide de IPython cahiers sous contrôle de version
Ce qui est une bonne stratégie pour garder IPython cahiers sous contrôle de version?
L'ordinateur portable de format est tout à fait prête pour le contrôle de version: si l'on veut contrôler la version portable et les sorties alors cela fonctionne très bien. La gêne vient lorsque l'on cherche à contrôler la version d'entrée, à l'exclusion de la cellule sorties (aka. "produits de construction"), qui peuvent être de taille des blobs binaires, en particulier pour les films et les parcelles. En particulier, je suis en train d'essayer de trouver un bon flux de travail:
- me permet de choisir entre inclusion ou d'exclusion de sortie,
- m'empêche de me accidentellement commettre de sortie si je ne le veux pas,
- me permet de garder de sortie dans ma version locale,
- me permet de voir quand j'ai des modifications dans les entrées à l'aide de mon système de contrôle de version (c'est à dire si je n'ai que la version de contrôler les entrées, mais mon fichier local sorties, alors je voudrais être en mesure de voir si les entrées ont changé (nécessitant une validation). À l'aide de la version de l'état de contrôle de commande enregistrez toujours une différence depuis le fichier local a sorties.)
- me permet de mettre à jour mon ordinateur portable (qui contient la sortie) à partir d'une mise à jour propre ordinateur portable. (mise à jour)
Comme mentionné, si j'ai choisi d'inclure les sorties (ce qui est souhaitable lors de l'utilisation de nbviewer par exemple), alors tout va bien. Le problème est quand je ne pas souhaitez contrôler la version de sortie. Il ya quelques outils et scripts pour le décapage de la sortie de l'ordinateur portable, mais souvent, je rencontre les problèmes suivants:
- J'ai accidentellement commettre une version avec le la sortie, et ainsi de polluer mon référentiel.
- Je clair de sortie à utiliser le contrôle de version, mais il serait vraiment plutôt de maintenir la sortie dans ma copie locale (parfois, il faut un certain temps pour reproduire par exemple).
- Certains des scripts de sortie de la bande de changer le format légèrement par rapport à la
Cell/All Output/Clear
option de menu, créant de ce fait un bruit indésirable dans les diffs. Ce problème est résolu par certaines réponses. - Lors de l'extraction de changements vers une nouvelle version du fichier, j'ai besoin de trouver un moyen d'intégrer ces changements dans mon travail portable sans refaire tout.
(mise à jour)
J'ai examiné plusieurs options que je vais développer ci-dessous, mais n'ai pas encore trouvé une bonne solution complète. Une solution complète peut nécessiter quelques modifications pour le IPython, ou peut s'appuyer sur de simples scripts externes. J'utilise actuellement mercurial, mais je voudrais une solution qui fonctionne également avec les git: une solution idéale serait de contrôle de version agnostique.
Cette question a été débattue à plusieurs reprises, mais il n'est pas définitive ou de solution claire à partir de la perspective de l'utilisateur. La réponse à cette question devrait permettre d'définitive de la stratégie. Il est très bien si elle nécessite une étude récente (même développement) version de IPython ou un facilement installé l'extension.
Mise à jour: j'ai été jouer avec mon modifiée portable version qui éventuellement enregistre une .clean
version avec tous les enregistrer à l'aide de Gregory Crosswhite suggestions. Cela répond à la plupart de mes contraintes, mais laisse la suite en suspens:
- Ce n'est pas encore une solution standard (nécessite une modification de la ipython source. Est-il un moyen de parvenir à ce comportement avec une simple extension? Besoin d'une forme de sur-save crochet.
- Un problème que j'ai avec le flux de travail actuel est en tirant les changements. Ceux-ci seront de la
.clean
fichier, et doivent ensuite être intégré en quelque sorte, dans ma version de travail. (Bien sûr, je peux toujours ré-exécuter le bloc-notes, mais cela peut être une douleur, surtout si certaines de ces résultats dépendent de longs calculs, des calculs parallèles, etc.) Je n'ai pas une bonne idée sur la façon de résoudre ce encore. Peut-être un flux de travail impliquant une extension comme ipycache pourrait fonctionner, mais cela semble un peu trop compliqué.
Notes
Retrait (décapage) Sortie
- Lorsque l'ordinateur portable est en cours d'exécution, on peut utiliser le
Cell/All Output/Clear
option de menu pour supprimer la sortie. - Il y a quelques scripts pour la suppression de la production, comme le script nbstripout.py qui suppriment la sortie, mais ne produit pas le même résultat que l'utilisation de l'ordinateur portable de l'interface. Cela a finalement été inclus dans l' ipython/nbconvert repo, mais cela a été fermé indiquant que les changements sont maintenant inclus dans ipython/ipython,mais la fonctionnalité correspondante ne semble pas avoir été encore comprises. (mise à jour) cela étant dit, Gregory Crosswhite de la solution montre que c'est assez facile à faire, même sans invoquer ipython/nbconvert, de sorte que cette approche est probablement réalisable s'il peut être bien accroché. (En l'attachant à chaque système de contrôle de version, cependant, ne semble pas être une bonne idée — ce qui devrait en quelque sorte de crochet dans le cahier mécanisme.)
Groupes de discussion
Questions
- 977: Cahier de demandes de fonctionnalités (Ouvert).
- 1280: Claire-tous sur l'option de sauvegarde (Ouvert). (Suit de cette discussion.)
- 3295: autoexported cahiers: seule l'exportation est explicitement marqué les cellules (Fermé). Résolu par extension 11 Ajouter writeandexecute magie (Fusionné).
Pull Requests
- 1621: clair Dans[] invite les numéros sur "Effacer Toutes les données de Sortie" (Fusionné). (Voir aussi 2519 (Fusionné).)
- 1563: clear_output améliorations (Fusionné).
- 3065: diff-capacité de carnets de notes (Fermé).
- 3291: Ajout de l'option pour ignorer les cellules de sortie lors de l'enregistrement. (Fermé). Cela semble extrêmement pertinent, cependant, a été fermé avec la suggestion d'utiliser un "nettoyage/bavure" du filtre. Une question pertinente que pouvez-vous utiliser si vous voulez la bande de sortie avant de lancer la commande git diff? ne semble pas avoir eu de réponse.
- 3312: WIP: blocs-notes, enregistrer des crochets (Fermé).
- 3747: ipynb -> ipynb transformateur (Fermé). C'est relocalisée dans Quatre mille cents soixante quinze.
- 4175: nbconvert: Jinjaless exportateur de base (Fusionné).
- 142: Utiliser l'entrée standard STDIN dans nbstripout si l'entrée n'est pas donnée (Ouvert).
- Sonne comme une grande chose à ajouter une question sur github.com/ipython/ipython ou de soumettre une demande d'extraction qui vous aide à poursuivre cet objectif.
- Comme vous pouvez le voir, il y a déjà pléthore de PR et les questions relatives à cet objectif. Une fois résolu (à savoir PR 4175), puis une réponse définitive devrait être disponible mais sera probablement impliquer certains de création de scripts supplémentaires à l'extérieur de IPython (git ou hg crochets, par exemple). Donc, je ne pense pas qu'il y aura rien gagné par l'ajout d'un nouveau PR ou d'une question.
- Ouais, leur développement est en mouvement rapide et constante de tous les jours. Les devs sont bonnes gens bien (et qui ont probablement lu cette publication). Je sais que je veux un simple flux de travail pour travailler avec git.
- Je l'ai fait aussi mention sur la liste de diffusion. Il ressemble à PR 4175 sera résolu en quelques heures/jours donc je m'attends à ce déplacer rapidement.
- Une fois que vous avez un travail de script pour supprimer la sortie, vous pouvez utiliser un Git "propre" filtre à appliquer automatiquement avant de s'engager (voir nettoyage/tacher de filtres).
- Toutes les réponses sont contenues dans la question! @mforbes, c'est bien de répondre à votre propre question, mais mieux si vous pouvez mettre les réponses dans une réponse.
- La question contient insatisfaisant solutions de contournement: chacun a au moins une limitation. Maintenant que PR 4175 a été fusionné, une solution complète qui peut probablement être formulées, mais cela doit encore être fait. Dès que j'ai le temps, je vais le faire (comme réponse) si quelqu'un d'autre ne fournit pas une solution satisfaisante dans le temps.
- Juste assez. Hâte d'être à la solution, je vais probablement l'utiliser.
- Une autre solution partielle: un filtre pour git qui affiche nettoyeur de diffs, mais encore valide la réelle cahiers entiers et non modifiée: gist.github.com/takluyver/bc8f3275c7d34abb68bf
- Très bonne question, mais je ne vois pas accepté de répondre. Quelles réponses avez-vous essayé? Est-il une solution recommandée?
- Je n'ai pas encore trouvé une solution recommandée: j'allais y aller avec la
--script
option, mais qui a été supprimé. Je suis en attente jusqu'à ce que la post-enregistrer les crochets sont mis en œuvre (qui sont prévus), là je pense que je vais être en mesure de fournir une solution acceptable la combinaison de plusieurs de ces techniques. - Il ressemble à IPython est proche. Une fois PR 6896 est acceptée, alors nous devrions être en mesure de résoudre cette question par le biais de pré-et post-enregistrer les crochets.
- Dirait que le PR était juste fusionné quelques jours après votre commentaire. Pourriez-vous ou quelqu'un de plus compétent que moi pour poster une réponse ici, qui montre comment utiliser la nouvelle fonctionnalité?
- Je vais par la suite, mais je suis un peu débordé dès maintenant. Peut-être quelqu'un va me battre pour elle!
- Je viens d'ajouter une réponse
- N'est-ce pas la meilleure solution PR de github juste changer le diff outil pour le cas particulier de cahier des diffs et seulement de montrer les diff des cellules d'entrée? Ensuite, vous obtenez toujours la sortie sauvé et rendu sur GitHub, ce qui est une grande fonctionnalité utile de carnets de notes.
Vous devez vous connecter pour publier un commentaire.
Voici ma solution avec git. Il vous permet de simplement ajouter et valider (et diff) comme d'habitude: ces opérations ne modifient pas votre arbre de travail, et en même temps de la (re)de l'exécution d'un cahier de ne pas modifier votre historique de git.
Même si cela peut probablement être adapté à d'autres Vcs, je sais que ce n'est pas satisfaire à vos exigences (au moins le VSC agnosticity). Encore, c'est parfait pour moi, et même si il n'a rien de particulièrement brillant, et beaucoup de gens sans doute déjà l'utiliser, je n'ai pas trouvé d'instructions claires sur la façon de la mettre en œuvre par googler autour. Il peut donc être utile à d'autres personnes.
~/bin/ipynb_output_filter.py
)chmod +x ~/bin/ipynb_output_filter.py
)Créer le fichier
~/.gitattributes
, avec le contenu suivantExécutez les commandes suivantes:
Fait!
Limitations:
somebranch
et vous negit checkout otherbranch; git checkout somebranch
, vous attendent généralement à l'arbre de travail inchangé. Ici au contraire, vous aurez perdu la sortie et les cellules de la numérotation des cahiers dont la source diffère entre les deux branches.git commit notebook_file.ipynb
, bien qu'il serait à tout le moins conservergit diff notebook_file.ipynb
gratuit de en base64 des ordures).Ma solution reflète le fait que personnellement, je n'aime pas garder généré des trucs de version de l'avis qu'à effectuer les fusions impliquant la sortie est presque garanti pour invalider la sortie ou votre productivité ou à la fois.
EDIT:
si vous ne adopter la solution que j'ai proposé, c'est - à une échelle mondiale, vous aurez de la difficulté dans le cas de certains repo git vous voulez à la version sortie. Donc, si vous voulez désactiver la sortie de filtrage pour un dépôt git, il suffit de créer à l'intérieur un fichier .git/info/attributs, avec
**.ipynb filtre=
que le contenu. Clairement, de la même manière, il est possible de faire l'inverse: activer le filtrage seulement pour un référentiel spécifique.
le code est maintenant maintenu dans sa propre repo git
si les instructions ci-dessus dans ImportErrors, essayez d'ajouter "ipython" avant le chemin d'accès du script:
MODIFIER: Mai 2016 (mise à jour en février 2017): il existe plusieurs alternatives pour mon script - pour être complet, voici une liste de ceux que je connais: nbstripout (d'autres variantes), nbstrip, jq.
if 'signature' in json_in.metadata: json_in.metadata['signature'] = ""
à ce script à la bande de signature.prompt_number
a été remplacé parexecution_count
?UserWarning: IPython.nbformat.current is deprecated
depuis la mise à jour Jupyter (ipython notebook 3.1.0). Est-il une mise à jour pour cette?ImportError
j'ai dû modifier à la ci-dessus pour l'exécuter à l'aide ipython:git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
~/.gitattributes
, s.t. d'autres personnes ont les mêmes filtres que je n'2) j'ai défini la regexp commeworkdir/**/*.ipynb filter=dropoutput_ipynb
, et j'ai mis la plupart de mon carnet de notes, workdir/ => si j'ai encore envie de pousser un portable avec la sortie et profiter de la bookmarkable rendu dans github, je viens de le mettre en dehors de ce dossier.rm...
de commande avecipynb_output_filter.py
(ou mieux: un des scripts qui modifiles les cahiers en place)... mais je n'ai aucune idée de la façon dont il joue avec plusieurs branchesNous avons un projet de collaboration où le produit est Jupyter les ordinateurs Portables, et nous avons une approche pour les six derniers mois, c'est génial de travailler: nous activer l'enregistrement de la
.py
automatiquement les fichiers et le suivi des.ipynb
fichiers et les.py
fichiers.De cette façon, si quelqu'un veut voir/télécharger le dernier bloc-notes, ils peuvent le faire via github ou nbviewer, et si quelqu'un veut voir la façon dont l'ordinateur portable code a changé, ils suffit de regarder les modifications apportées à la
.py
fichiers.Pour
Jupyter
cahier des serveurs, cela peut être fait en ajoutant les lignesà la
jupyter_notebook_config.py
fichier et le redémarrage de l'ordinateur serveur.Si vous ne savez pas dans quel répertoire pour trouver votre
jupyter_notebook_config.py
fichier, vous pouvez taperjupyter --config-dir
, et si vous ne trouvez pas le fichier, vous pouvez le créer en tapantjupyter notebook --generate-config
.Pour
Ipython 3
cahier des serveurs, cela peut être fait en ajoutant les lignesà la
ipython_notebook_config.py
fichier et le redémarrage de l'ordinateur serveur. Ces lignes sont d'une github questions réponse @minrk fourni et @dror les inclut dans sa réponse ainsi.Pour
Ipython 2
cahier des serveurs, ce qui peut être accompli par le démarrage du serveur à l'aide de:ou par l'ajout de la ligne
à la
ipython_notebook_config.py
fichier et le redémarrage de l'ordinateur serveur.Si vous ne savez pas dans quel répertoire pour trouver votre
ipython_notebook_config.py
fichier, vous pouvez taperipython locate profile default
, et si vous ne trouvez pas le fichier, vous pouvez le créer en tapantipython profile create
.Voici notre projet sur github qui est de l'utilisation de cette approche: et voici un github exemple d'explorer les changements récents à un ordinateur portable.
Nous avons été très heureux avec cela.
--script
a travaillé dans la pratique. Le problème, c'est que les ordinateurs portables pourrait être énorme si les images sont conservées. Une solution idéale le long de cette voie pourrait utiliser quelque chose comme git-annex pour garder une trace de la dernière d'un ordinateur portable.--script
est obsolète. ipython.org/ipython-doc/3/whatsnew/version3.html.py
et.html
de IPython cahiers: protips.maxmasnick.com/...jupyter notebook --generate-config
pour créer un fichier de configuration. La commandejupyter --config-dir
découvre le répertoire contient les fichiers de configuration. Et l'extrait de code donné par @Riches devraient être ajoutés au fichier nomméjupyter_notebook_config.py
. Le reste fonctionne comme avant.check_call(['ipython'
aveccheck_call(['jupyter'
, sinon vous obtiendrez un message d'avertissement quiipython nbconvert
est obsolète et vous devez utiliserjupyter nbconvert
à la place. (Jupyter v4.1.0, iPython v4.1.2)J'ai créé
nbstripout
, basé sur MinRKs gist, qui supporte à la fois Git et Mercurial (grâce à mforbes). Il est destiné à être utilisé soit de manière autonome, sur la ligne de commande ou comme un filtre, qui est facilement (onu)installé dans le référentiel actuel vianbstripout install
/nbstripout uninstall
.L'obtenir à partir d' PyPI ou tout simplement
nbstripout --install
travail à l'intérieur de l'git bash MINGW64 terminal; il a échoué dans le terminal server de Windows. C'est très bien, depuis que j'utilise git bash terminal pour toutes mes commandes git de toute façon.nbstripout
ne prend pas en charge ce cas d'utilisation, facilement puisqu'il s'appuie sur le format JSON de l'ordinateur Portable. Vous êtes probablement mieux d'écrire un script spécialisés à votre cas d'utilisation.Ici est une nouvelle solution de Cyrille Rossant pour IPython 3.0, qui persiste à démarque plutôt que des fichiers basé sur json ipymd fichiers:
https://github.com/rossant/ipymd
(2017-02)
stratégies
nbstripout
, )nbstripout
,)nbconvert
de python: name.ipynb.py (nbconvert
)nbconvert
,ipymd
)outils
nbstripout
: dépouiller les sorties à partir d'un ordinateur portablepip install nbstripout; nbstripout install
ipynb_output_filter
: dépouiller les sorties à partir d'un ordinateur portableipymd
: convertir entre {Jupyter, Markdown, O'Reilly Atlas Markdown, OpenDocument .py}nbdime
: "Des outils pour la comparaison et la fusion de Jupyter des ordinateurs portables". (2015)nbdiff
: comparer les ordinateurs portables dans un terminal de manière convivialenbmerge
: trois voies de fusion de cahiers automatique de la résolution des conflitsnbdiff-web
: vous montre une riche rendus diff de cahiersnbmerge-web
: vous donne un basé sur le web à trois voies de l'outil de fusion pour les ordinateurs portablesnbshow
: un ordinateur portable dans un terminal de manière convivialeComme l'a souligné, la
--script
est obsolète dans3.x
. Cette approche peut être utilisée par l'application d'un post-enregistrement-crochet. En particulier, ajoutez ce qui suit àipython_notebook_config.py
:Le code est pris de #8009.
.py
fichier d'un ordinateur portable est problématique, de sorte que ce n'est malheureusement pas une solution complète. (Je souhaite qu'il a été, comme il est très agréable de diff.py
fichiers au lieu de carnets de notes. Peut-être la nouvelle ordinateur portable diff fonctionnalité sera utile.--script
comportement, indépendamment de contrôle de version. J'ai eu quelques problèmes au début, donc juste au cas où je peux sauver quelqu'un certain temps: 1) Si leipython_notebook_config.py
est manquant dans le dossier de profil, exécutezipython profile create
pour le générer. 2) Si il semble que la post-enregistrement-crochet est ignoré, exécutez ipython avec--debug
pour diagnostiquer le problème. 3) Si le script échoue avec l'erreurImportError: No module named mistune
- installation simple minstue:pip install mistune
.J'ai enfin trouvé un productifs et la manière simple de faire Jupyter et Git jouent bien ensemble. Je suis encore dans les premières étapes, mais je pense déjà qu'il est beaucoup mieux que toutes les autres solutions alambiquées.
Le Code De Visual Studio est cool et open source de l'éditeur de code de Microsoft. Il a une excellente extension Python qui vous permet désormais de importer un Jupyter Portable que le code python.
Après l'importation de votre ordinateur portable à un fichier python, le code et tous les démarques sera réuni dans un ordinaire fichier python, avec des marqueurs spéciaux dans les commentaires. Vous pouvez voir dans l'image ci-dessous:
Votre fichier python a juste le contenu du cahier des cellules d'entrée. La sortie sera générée dans une fissure de la fenêtre. Vous avez pur code dans le bloc-notes, il ne change pas alors que vous venez d'exécuter. Pas mêlé de sortie avec votre code. Pas étrange Json incompréhensible format d'analyser vos diff.
Juste pur python code où vous pouvez facilement identifier chaque diff.
Je n'ai même pas besoin de version de ma
.ipynb
fichiers plus. Je peux mettre un*.ipynb
ligne dans.gitignore
.Besoin de générer un cahier de publier ou de partager avec quelqu'un? Pas de problème, juste cliquez sur le bouton exporter dans interactive fenêtre python
Je l'ai utilisé seulement pour un jour, mais enfin je peux heureusement utilisation Jupyter avec Git.
P. S.: VSCode de complétion de code, c'est beaucoup mieux que Jupyter.
Malheureusement, je ne sais pas beaucoup sur la Mercurial, mais je peux vous donner une solution qui fonctionne avec Git, dans l'espoir que vous pourriez être en mesure de traduire mes commandes Git dans leurs Mercurial équivalents.
Pour le fond, dans Git le
add
commande stocke les modifications qui ont été apportées à un fichier dans une zone de transit. Une fois que vous avez fait cela, toute modification ultérieure du fichier sont ignorés par Git sauf si vous lui dites que pour leur bien. Par conséquent, le script suivant, qui, pour chacun des fichiers, des bandes de toutes lesoutputs
etprompt_number sections
, les étapes, les dépouillé de fichier, puis de restaurer l'original:REMARQUE: Si l'exécution de cette, vous reçoit un message d'erreur comme
ImportError: No module named IPython.nbformat
, puis utilisezipython
pour exécuter le script au lieu depython
.Une fois que le script a été exécuté sur les fichiers dont les modifications que vous avez voulu commettre, il suffit d'exécuter
git commit
..clean
extension. Malheureusement, je ne vois pas comment faire sans modifier directement IPython (bien que ce changement a été assez trivial). Je vais jouer avec ça pendant un moment et voir si elle convient à tous mes besoins.- Je utiliser une approche très pragmatique; ce qui fonctionne bien pour plusieurs cahiers, à plusieurs côtés. Et en plus il me permet de "transférer" les cahiers autour. Il fonctionne à la fois pour Windows et Unix/MacOS.
Al la pensée, il est simple, est de résoudre les problèmes ci-dessus...
Concept
Fondamentalement, ne pas suivre le
.ipnyb
-fichiers, seul le correspondant.py
-fichiers.En commençant par le notebook-serveur avec le
--script
option, le fichier est automatiquement créé et sauvegardé lorsque l'ordinateur portable est enregistré.Ceux
.py
-fichiers contiennent toutes les entrées; les non-code est enregistré dans les commentaires, comme le sont les cellules les frontières. Ces fichiers peuvent être lus/importés ( et de déplacement) dans le cahier-serveur de (re)créer un carnet de notes. Seule la sortie est parti; jusqu'à ce qu'il est re-run.Personnellement, j'utilise mercurial à la version piste de la
.py
fichiers; et l'utilisation de la normale (ligne de commande) commandes pour ajouter, le check-in (ect) pour que les. La plupart des autres (D)VCS permettra cette.Ses simples à suivre l'histoire, le
.py
sont de petite taille, textuelles et simple du diff. De temps à autres, nous avons besoin d'un clone (juste de la branche; lancer un 2ème ordinateur portable-sever-il), ou une version plus ancienne, l'enregistrement et l'importation dans un cahier-serveur), etc.Trucs & astuces
--script
option) et faire de la version de suivre.py
-fichier, mais n' pas vérifier dans.Souhaite
file@date+rev.py
) devrait être utileIl serait de beaucoup à ajouter qu'; et peut-être que je vais le faire une fois. Jusqu'à maintenant, je viens de le faire à la main.
.py
fichier vers un ordinateur portable? J'aime cette approche, mais parce que.ipynb
->.py
->.ipynb
est potentiellement à perte, je n'ai pas pris cela au sérieux..py
à.ipynb
formats. Il y a un question à propos de cette alors peut – être que cela sera la base pour une solution complète..py
fichiers.ipynb
fichiers.nbconvert
ne semble pas encore à l'appui de cela, et je n'ai pas de carnet de bord depuis que j'ai exécuteripython notebook
manuellement. Avez-vous des suggestions d'ordre général sur la façon de mettre en œuvre cette rétro conversion?.py
-pour-portable de transformation n'est pas prévu pour un aller-retour. Donc cela ne peut pas vraiment être une solution générale s'il est sympa il fonctionne pour vous.--script
a été supprimé en option. Il devrait être rétabli lorsque IPython 3.0 est sorti bien. Ne peut toujours pas trouver un bon moyen de gagner de l'.py
fichiers dans un ordinateur portable sans avoir à écrire un convertisseur personnalisé..ipynb
au travers de Markdown (de toutes choses!) pour le contrôle de version à l'aide de Notedown. Cela me donne la possibilité de décapage de sortie avant de s'engage, mais le plus important pour mon cas d'utilisation (cours en ligne), Markdown est beaucoup plus facile de refactoriser. Normalement, il est très difficile de faire une réorganisation dans un ensemble de Cahiers: en Déplaçant le multi-cellule des morceaux à l'intérieur d'un ordinateur Portable ou entre les ordinateurs Portables, la réorganisation, la promotion ou la rétrogradation des sections, de la scission ou la fusion de blocs-notes, etc. Tout cela est facile en Markdown (donné un bon éditeur de texte).Venez à nous "jupytext" qui ressemble à une solution parfaite. Elle génère .py fichier de l'ordinateur portable et de garde, puis en synchronisation. Vous pouvez le contrôle de version, de comparaison et de fusion entrées via la .py fichier sans perdre les sorties. Lorsque vous ouvrez le bloc-notes il utilise le .py pour les cellules d'entrée et de la .ipynb pour la sortie. Et si vous souhaitez inclure la sortie dans git, alors vous pouvez simplement ajouter le ipynb.
https://github.com/mwouts/jupytext
Le très populaire 2016 réponses ci-dessus sont incompatibles hacks par rapport à la meilleure façon de le faire en 2019.
Existe plusieurs options, la meilleure des réponses à la question est Jupytext.
Jupytext
Attraper le Vers la Science des Données article sur Jupytext
La façon dont il fonctionne avec le contrôle de version est de vous mettre à la fois l' .py et .ipynb fichiers dans le contrôle de version. Regardez la .py si vous voulez l'entrée diff, regardez le .ipynb si vous voulez plus tard rendu de la sortie.
Notable mentionne: VS studio, nbconvert, nbdime, de l'hydrogène
Je pense qu'avec un peu plus de travail, VS studio et/ou de l'hydrogène (ou similaire) va devenir les acteurs dominants dans la solution à ce flux de travail.
De suivi sur l'excellent script de Pietro Battiston, si vous obtenez une Unicode erreur d'analyse comme ceci:
Vous pouvez ajouter au début du script:
J'ai construit paquet python qui permet de résoudre ce problème
https://github.com/brookisme/gitnb
Il fournit une interface CLI avec un git-inspiré de la syntaxe de suivi/mise à jour/diff ordinateurs portables à l'intérieur de votre repo git.
Heres' un exemple
Noter que la dernière étape, où je suis à l'aide de "gitnb commettre" est en train de commettre à votre repo git. Son essentiellement un wrapper pour
Il y a plusieurs méthodes, et peut être configuré de sorte qu'il ne nécessite plus ou moins de la saisie de l'utilisateur à chaque étape, mais c'est l'idée générale.
Après creuser autour, j'ai enfin trouvé cette relativement simple pré-enregistrer crochet sur le Jupyter docs. Il supprime la cellule de données de sortie. Vous devez le coller dans le
jupyter_notebook_config.py
fichier (voir ci-dessous pour les instructions).De Riche Signell réponse:
Puisqu'il en existe donc de nombreuses stratégies et des outils pour gérer le contrôle de version pour les ordinateurs portables, j'ai essayé de créer un diagramme de flux de choisir une stratégie appropriée (créé en avril 2019)
Après quelques années de retrait de sorties dans des cahiers, j'ai essayé de trouver une meilleure solution. Je vais maintenant utiliser Jupytext, une extension pour les deux Jupyter Portable et Jupyter Laboratoire que j'ai conçu.
Jupytext pouvez convertir Jupyter cahiers de divers formats texte (Scripts, Markdown et R Markdown). Et à l'inverse. Il offre également la possibilité de paire un ordinateur portable à l'un de ces formats, et de synchroniser automatiquement les deux représentations de l'ordinateur portable (un
.ipynb
et un.md/.py/.R
fichier).Laissez-moi vous expliquer comment Jupytext réponses aux questions ci-dessus:
La
.md/.py/.R
fichier contient uniquement les cellules d'entrée. Vous devez toujours suivre ce fichier. La Version la.ipynb
fichier seulement si vous voulez suivre les sorties.Ajouter
*.ipynb
à.gitignore
Sorties sont conservés dans l' (local)
.ipynb
fichierLa diff sur le
.py/.R
ou.md
fichier est ce que vous êtes à la recherche pourTirer la dernière révision de la
.py/.R
ou.md
fichier et l'actualisation de votre ordinateur portable dans Jupyter (Ctrl+R). Vous trouverez la dernière entrée des cellules à partir du fichier texte, avec des sorties de la.ipynb
fichier. Le noyau n'est pas affecté, ce qui signifie que vos variables locales sont préservées, vous pouvez toujours vous travaillez où vous l'avez laissé.Ce que j'aime avec Jupytext est que l'ordinateur portable (sous la forme d'un
.py/.R
ou.md
fichier) peut être modifié dans votre IDE favori. Avec cette approche, refactoring un portable devient facile. Une fois que vous avez terminé, vous avez juste besoin de rafraîchissement de l'ordinateur portable dans Jupyter.Si vous voulez faire un essai: installer Jupytext avec
pip install jupytext
et redémarrez votre Jupyter ordinateur Portable ou un Laboratoire de l'éditeur. Ouvrez le bloc-notes que vous voulez de contrôle de version, et paire il à un Abattement de fichier (ou un Script) à l'aide de la Jupytext Menu dans Jupyter ordinateur portable (ou le Jupytext commandes dans Jupyter de Laboratoire). Enregistrer votre ordinateur portable, et vous obtiendrez deux fichiers: l'original.ipynb
, en plus de la promesse de la représentation de texte de l'ordinateur portable, qui est un ajustement parfait pour le contrôle de version!Pour ceux qui pourraient être intéressés: Jupytext est également disponible sur le ligne de commande.
J'ai fait ce que Albert & les Riches ont - ils, N'est pas la version .ipynb fichiers (comme ceux-ci peuvent contenir des images, qui est salissant). Au lieu de cela, toujours exécuter
ipython notebook --script
ou mettrec.FileNotebookManager.save_script = True
dans votre fichier de configuration, de sorte qu'un (versionable).py
fichier est toujours créé lorsque vous enregistrez votre ordinateur portable.Pour régénérer les ordinateurs portables (après la vérification d'une mise en pension ou de la commutation d'une branche), j'ai mis le script py_file_to_notebooks.py dans le répertoire où je stocke mes cahiers.
Maintenant, après vérification d'un dépôt, il suffit d'exécuter
python py_file_to_notebooks.py
pour générer le ipynb fichiers. Après le changement de direction générale, vous pouvez exécuterpython py_file_to_notebooks.py -ov
pour remplacer l'existant ipynb fichiers.Juste pour être sur le côté sécuritaire, il est bon d'ajouter aussi
*.ipynb
à votre.gitignore
fichier.Edit: je n'ai plus le faire parce que (A) vous avez pour régénérer vos cahiers de py fichiers chaque fois que vous réglez une branche et (B) il y a d'autres trucs comme markdown dans les cahiers que vous perdez. J'ai plutôt sortie de la bande de carnets de notes à l'aide d'un git filter. Discussion sur la façon de le faire est ici.
.py
fichiers.ipynb
est problématique, surtout avec la version 4 cahiers pour qui il n'y a pas encore d'un convertisseur. On serait actuellement besoin d'utiliser la v3 de l'importateur ensuite convertir en v4 et je suis un peu préoccupé par ce compliqué voyage. Aussi, un.py
fichier n'est pas un très bon choix si l'ordinateur portable est principalement Julia code! Enfin,--script
est obsolète, donc je pense que les crochets sont la voie à suivre.Ok, donc il semble que la meilleure solution actuelle, comme par une discussion ici, est de faire un git filtre automatiquement la sortie de la bande de ipynb fichiers sur validation.
Voici ce que j'ai fait pour le faire fonctionner (copié à partir de cette discussion):
J'ai modifié cfriedline de nbstripout fichier légèrement pour donner une information d'erreur lorsque vous ne pouvez pas importer les dernières IPython:
https://github.com/petered/plato/blob/fb2f4e252f50c79768920d0e47b870a8d799e92b/notebooks/config/strip_notebook_output
Et de l'ajouter à mon repo, permet de dire que dans
./relative/path/to/strip_notebook_output
Également ajouté le fichier .gitattributes fichier à la racine de l'opération, contenant:
Et créé un
setup_git_filters.sh
contenantEt a couru
source setup_git_filters.sh
. La fantaisie $(git rev-parse...), c'est de trouver le chemin d'accès local de votre repo sur tout (Unix) de la machine.Ce jupyter extension permet aux utilisateurs de pousser jupyter carnets de notes directement sur github.
Veuillez regarder ici
https://github.com/sat28/githubcommit
Comment parler de l'idée discuté dans le post ci-dessous, où la sortie de l'ordinateur portable doit être maintenue, avec l'argument qu'il pourrait prendre un certain temps de génération, et il est pratique depuis GitHub peut désormais rendre des ordinateurs portables. Il y a auto-save crochets ajoutée pour l'exportation .py fichier, utilisé pour les diffs et .html pour les partager avec les membres de l'équipe qui n'utilisent pas les ordinateurs portables ou git.
https://towardsdatascience.com/version-control-for-jupyter-notebook-3e6cef13392d