version control - संस्करण नियंत्रण के तहत आईपीथन नोटबुक का उपयोग करना




version-control ipython (10)

(2017-02)

रणनीतियाँ

  • on_commit ():
    • आउटपुट को पट्टी> name.ipynb ( nbstripout ,)
    • आउटपुट को पट्टी> name.clean.ipynb ( nbstripout ,)
    • हमेशा python पर nbconvert: name.ipynb.py ( nbconvert )
    • हमेशा मार्कडाउन में कनवर्ट करें: name.ipynb.md ( nbconvert , ipymd )
  • vcs.configure ():
    • गिट difftool, mergetool: nbdiff और nbmerge nbdime से

उपकरण

  • nbstripout : आउटपुट को नोटबुक से पट्टी करें
  • ipynb_output_filter : आउटपुट को नोटबुक से पट्टी करें
  • ipymd : {जुपीटर, मार्कडाउन, O'Reilly एटलस मार्कडाउन, ओपन डॉक्यूमेंट, .py} के बीच कनवर्ट करें
  • nbdime : "Jupyter नोटबुक की diffing और विलय के लिए उपकरण।" (2015)
    • src: https://github.com/jupyter/nbdime
    • दस्तावेज़: http://nbdime.readthedocs.io/
      • nbdiff : टर्मिनल-अनुकूल तरीके से नोटबुक की तुलना करें
      • nbmerge : स्वत: संघर्ष समाधान के साथ नोटबुक की तीन तरह की विलय
        • nbdime nbmerge एक गिट मर्ज उपकरण के रूप में काम करता है
      • nbdiff-web : आपको नोटबुक की समृद्ध रेंडर nbdiff-web दिखाता है
      • nbmerge-web : आपको नोटबुक के लिए एक वेब-आधारित तीन-तरफा विलय टूल देता है
      • nbshow : टर्मिनल-अनुकूल तरीके से एक एकल नोटबुक प्रस्तुत करें

संस्करण नियंत्रण के तहत आईपीथन नोटबुक रखने के लिए एक अच्छी रणनीति क्या है?

नोटबुक प्रारूप संस्करण नियंत्रण के लिए काफी अनुकूल है: यदि कोई नोटबुक और आउटपुट को वर्जन नियंत्रित करना चाहता है तो यह काफी अच्छा काम करता है। परेशानी तब आती है जब कोई केवल सेल आउटपुट (उर्फ। "बिल्ड उत्पाद") को छोड़कर इनपुट को नियंत्रित करने के लिए चाहता है, जो कि बड़े बाइनरी ब्लब्स हो सकता है, खासकर फिल्मों और भूखंडों के लिए। विशेष रूप से, मैं एक अच्छा वर्कफ़्लो खोजने की कोशिश कर रहा हूं कि:

  • मुझे आउटपुट को शामिल या बहिष्कृत करने के बीच चयन करने की अनुमति देता है,
  • अगर मैं इसे नहीं चाहता तो मुझे गलती से आउटपुट करने से रोकता है,
  • मुझे अपने स्थानीय संस्करण में आउटपुट रखने की अनुमति देता है,
  • मुझे यह देखने की अनुमति देता है कि मेरे संस्करण नियंत्रण प्रणाली का उपयोग करते हुए इनपुट में परिवर्तन कब होता है (यानी यदि मैं केवल इनपुट को इनपुट नियंत्रित करता हूं लेकिन मेरी स्थानीय फ़ाइल में आउटपुट होता है, तो मैं यह देखने में सक्षम होना चाहता हूं कि इनपुट बदल गया है या नहीं (प्रतिबद्धता की आवश्यकता है )। स्थानीय नियंत्रण फ़ाइल आउटपुट के बाद संस्करण नियंत्रण स्थिति कमांड का उपयोग हमेशा एक अंतर पंजीकृत करेगा।)
  • मुझे एक अद्यतन स्वच्छ नोटबुक से मेरी कामकाजी नोटबुक (जिसमें आउटपुट शामिल है) को अपडेट करने की अनुमति देता है। (अद्यतन करें)

जैसा कि बताया गया है, अगर मैंने आउटपुट शामिल करना चुना है (उदाहरण के लिए nbviewer का उपयोग करते समय वांछनीय है), तो सब कुछ ठीक है। समस्या यह है कि जब मैं आउटपुट को आउटपुट नियंत्रित नहीं करना चाहता हूं। नोटबुक के आउटपुट को अलग करने के लिए कुछ टूल और स्क्रिप्ट हैं, लेकिन अक्सर मुझे निम्नलिखित समस्याएं आती हैं:

  1. मैं गलती से आउटपुट के साथ एक संस्करण प्रतिबद्ध करता हूं, जिससे मेरी भंडार प्रदूषित हो जाती है।
  2. मैं संस्करण नियंत्रण का उपयोग करने के लिए आउटपुट साफ़ करता हूं, लेकिन वास्तव में आउटपुट को मेरी स्थानीय प्रतिलिपि में रखता हूं (कभी-कभी उदाहरण के लिए पुन: पेश करने में कुछ समय लगता है)।
  3. आउटपुट को पट्टी करने वाली कुछ स्क्रिप्ट्स Cell/All Output/Clear मेनू विकल्प की तुलना में प्रारूप को थोड़ा बदल देती हैं, जिससे diffs में अवांछित शोर बनाते हैं। यह कुछ उत्तरों द्वारा हल किया गया है।
  4. फ़ाइल के एक साफ संस्करण में परिवर्तन खींचते समय, मुझे अपनी कार्यशील नोटबुक में उन सभी परिवर्तनों को फिर से शुरू किए बिना उन परिवर्तनों को शामिल करने का कोई तरीका ढूंढना होगा। (अद्यतन करें)

मैंने कई विकल्पों पर विचार किया है जिन पर मैं नीचे चर्चा करूंगा, लेकिन अभी तक एक अच्छा व्यापक समाधान नहीं मिला है। एक पूर्ण समाधान के लिए आईपीथन में कुछ बदलाव की आवश्यकता हो सकती है, या कुछ सरल बाहरी स्क्रिप्ट पर निर्भर हो सकती है। मैं वर्तमान में Mercurial का उपयोग करता हूं, लेकिन एक समाधान चाहते हैं जो गिट के साथ भी काम करता है: एक आदर्श समाधान संस्करण-नियंत्रण अज्ञेयवादी होगा।

इस मुद्दे पर कई बार चर्चा की गई है, लेकिन उपयोगकर्ता के परिप्रेक्ष्य से कोई निश्चित या स्पष्ट समाधान नहीं है। इस प्रश्न का उत्तर निश्चित रणनीति प्रदान करना चाहिए। यह ठीक है अगर इसे आईपीथॉन का हालिया (यहां तक ​​कि विकास) संस्करण या आसानी से स्थापित एक्सटेंशन की आवश्यकता है।

अपडेट करें: मैं अपने संशोधित नोटबुक संस्करण के साथ खेल रहा हूं जो वैकल्पिक रूप से ग्रेगरी क्रॉसवाइट के सुझावों का उपयोग करके प्रत्येक सहेजने के साथ एक .clean संस्करण बचाता है। यह मेरी अधिकांश बाधाओं को पूरा करता है लेकिन निम्नलिखित अनसुलझे छोड़ देता है:

  1. यह अभी तक एक मानक समाधान नहीं है (ipython स्रोत में संशोधन की आवश्यकता है। क्या इस व्यवहार को एक साधारण एक्सटेंशन के साथ प्राप्त करने का कोई तरीका है? किसी प्रकार की ऑन-सेव हुक की आवश्यकता है।
  2. वर्तमान वर्कफ़्लो के साथ मेरे पास एक समस्या है जो परिवर्तन खींच रही है। ये .clean फ़ाइल में आएंगे, और फिर किसी भी तरह से मेरे कामकाजी संस्करण में एकीकृत करने की आवश्यकता है। (बेशक, मैं हमेशा नोटबुक को फिर से निष्पादित कर सकता हूं, लेकिन यह दर्द हो सकता है, खासकर यदि कुछ परिणाम लंबी गणनाओं, समानांतर गणनाओं आदि पर निर्भर करते हैं) मुझे अभी तक इसे हल करने के बारे में कोई अच्छा विचार नहीं है । शायद ipycache जैसे एक्सटेंशन से जुड़े वर्कफ़्लो में काम हो सकता है, लेकिन यह थोड़ा जटिल लगता है।

टिप्पणियाँ

आउटपुट को हटा रहा है (अलग करना)

  • जब नोटबुक चल रहा है, तो आउटपुट को हटाने के लिए कोई Cell/All Output/Clear मेनू विकल्प का उपयोग कर सकता है।
  • आउटपुट को हटाने के लिए कुछ स्क्रिप्ट हैं, जैसे स्क्रिप्ट nbstripout.py जो आउटपुट को nbstripout.py , लेकिन नोटबुक इंटरफ़ेस का उपयोग करने के समान उत्पादन नहीं करती है। इसे अंततः ipython/nbconvert रेपो में शामिल किया गया था, लेकिन यह बंद कर दिया गया है कि परिवर्तन अब ipython/nbconvert में शामिल हैं, लेकिन इसी कार्यक्षमता को अभी तक शामिल नहीं किया गया है। (अपडेट) कहा जा रहा है कि, ग्रेगरी क्रॉसवाइट के समाधान से पता चलता है कि यह बहुत आसान है, यहां तक ​​कि ipython/nbconvert आह्वान किए बिना भी, इसलिए यह दृष्टिकोण शायद काम करने योग्य है अगर इसे ठीक से लगाया जा सकता है। (हालांकि प्रत्येक संस्करण नियंत्रण प्रणाली को संलग्न करना , एक अच्छा विचार प्रतीत नहीं होता है - यह किसी भी तरह नोटबुक तंत्र में हुक होना चाहिए।)

समाचार समूह

मुद्दे

पुल अनुरोध


Pietro Battiston द्वारा उत्कृष्ट लिपि पर अनुवर्ती करने के लिए, यदि आपको इस तरह एक यूनिकोड पार्सिंग त्रुटि मिलती है:

Traceback (most recent call last):
  File "/Users/kwisatz/bin/ipynb_output_filter.py", line 33, in <module>
write(json_in, sys.stdout, NO_CONVERT)
  File "/Users/kwisatz/anaconda/lib/python2.7/site-packages/IPython/nbformat/__init__.py", line 161, in write
fp.write(s)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2014' in position 11549: ordinal not in range(128)

आप स्क्रिप्ट की शुरुआत में जोड़ सकते हैं:

reload(sys)
sys.setdefaultencoding('utf8')

चारों ओर खोदने के बाद, मुझे अंततः जुपीटर दस्तावेज़ों पर यह अपेक्षाकृत सरल प्री-सेव हुक मिला । यह सेल आउटपुट डेटा स्ट्रिप्स। आपको इसे jupyter_notebook_config.py फ़ाइल में पेस्ट करना होगा (निर्देशों के लिए नीचे देखें)।

def scrub_output_pre_save(model, **kwargs):
    """scrub output before saving notebooks"""
    # only run on notebooks
    if model['type'] != 'notebook':
        return
    # only run on nbformat v4
    if model['content']['nbformat'] != 4:
        return

    for cell in model['content']['cells']:
        if cell['cell_type'] != 'code':
            continue
        cell['outputs'] = []
        cell['execution_count'] = None
        # Added by binaryfunt:
        if 'collapsed' in cell['metadata']:
            cell['metadata'].pop('collapsed', 0)

c.FileContentsManager.pre_save_hook = scrub_output_pre_save

रिच सिग्नल के जवाब से :

यदि आप सुनिश्चित नहीं हैं कि कौन सी निर्देशिका में आपकी jupyter_notebook_config.py फ़ाइल है, तो आप jupyter --config-dir [कमांड प्रॉम्प्ट / टर्मिनल] टाइप कर सकते हैं, और यदि आपको वहां फ़ाइल नहीं मिलती है, तो आप इसे बना सकते हैं टाइपिंग jupyter notebook --generate-config


जैसा कि इंगित किया गया है, - --script को 3.x में बहिष्कृत किया गया है। इस दृष्टिकोण का उपयोग पोस्ट-सेव-हुक लगाने के द्वारा किया जा सकता है। विशेष रूप से, ipython_notebook_config.py में निम्न जोड़ें:

import os
from subprocess import check_call

def post_save(model, os_path, contents_manager):
    """post-save hook for converting notebooks to .py scripts"""
    if model['type'] != 'notebook':
        return # only do this for notebooks
    d, fname = os.path.split(os_path)
    check_call(['ipython', 'nbconvert', '--to', 'script', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save

कोड # 800 9 से लिया गया है।


दुर्भाग्यवश, मुझे Mercurial के बारे में बहुत कुछ पता नहीं है, लेकिन मैं आपको एक संभावित समाधान दे सकता हूं जो कि गिट के साथ काम करता है, उम्मीद है कि आप मेरे गिट कमांड को उनके Mercurial समकक्षों में अनुवाद करने में सक्षम हो सकते हैं।

पृष्ठभूमि के लिए, गिट में add कमांड एक स्टेजिंग क्षेत्र में फ़ाइल में किए गए परिवर्तनों को संग्रहीत करता है। एक बार ऐसा करने के बाद, फ़ाइल में आने वाले किसी भी बदलाव को गिट द्वारा अनदेखा किया जाता है जबतक कि आप उन्हें चरणबद्ध करने के लिए भी नहीं बताते। इसलिए, निम्न स्क्रिप्ट, जो, प्रत्येक दी गई फ़ाइलों के लिए, सभी outputs और prompt_number sections को स्ट्रिप्स prompt_number sections , स्ट्रिप की गई फ़ाइल को चरणबद्ध करती है, और फिर मूल को पुनर्स्थापित करती है:

नोट: यदि इसे चलाना आपको एक त्रुटि संदेश मिलता है जैसे ImportError: No module named IPython.nbformat , तो ipython बजाय स्क्रिप्ट चलाने के लिए ipython का उपयोग ipython

from IPython.nbformat import current
import io
from os import remove, rename
from shutil import copyfile
from subprocess import Popen
from sys import argv

for filename in argv[1:]:
    # Backup the current file
    backup_filename = filename + ".backup"
    copyfile(filename,backup_filename)

    try:
        # Read in the notebook
        with io.open(filename,'r',encoding='utf-8') as f:
            notebook = current.reads(f.read(),format="ipynb")

        # Strip out all of the output and prompt_number sections
        for worksheet in notebook["worksheets"]:
            for cell in worksheet["cells"]:
               cell.outputs = []
               if "prompt_number" in cell:
                    del cell["prompt_number"]

        # Write the stripped file
        with io.open(filename, 'w', encoding='utf-8') as f:
            current.write(notebook,f,format='ipynb')

        # Run git add to stage the non-output changes
        print("git add",filename)
        Popen(["git","add",filename]).wait()

    finally:
        # Restore the original file;  remove is needed in case
        # we are running in windows.
        remove(filename)
        rename(backup_filename,filename)

एक बार जब उन फ़ाइलों पर लिपि चलाई जाती है जिनके परिवर्तन आप प्रतिबद्ध करना चाहते हैं, तो बस git commit


नीचे दिए गए पद में चर्चा के बारे में विचार, जहां नोटबुक का आउटपुट रखा जाना चाहिए, तर्क के साथ कि इसे उत्पन्न करने में काफी समय लग सकता है, और यह आसान है क्योंकि गिटहब अब नोटबुक प्रस्तुत कर सकता है। .py फ़ाइल निर्यात करने के लिए ऑटो-सेव हुक जोड़े गए हैं, जो कि उन सदस्यों के साथ साझा करने के लिए diffs और .html के लिए उपयोग किए जाते हैं जो नोटबुक या गिट का उपयोग नहीं करते हैं।

https://towardsdatascience.com/version-control-for-jupyter-notebook-3e6cef13392d


मैंने other के आधार पर nbstripout.py बनाया है, जो गिट और मर्कुरियल (मोफोर्ब्स के लिए धन्यवाद) दोनों का समर्थन करता है। इसका उद्देश्य कमांड लाइन या फ़िल्टर के रूप में स्टैंडअलोन का उपयोग करना है, जो कि वर्तमान भंडार में nbstripout install / nbstripout uninstall माध्यम से आसानी से (un) स्थापित है।

इसे PyPI या बस से प्राप्त करें

pip install nbstripout

मैंने अल्बर्ट और रिच ने क्या किया - संस्करण .ipynb फ़ाइलों को न करें (क्योंकि इसमें छवियां हो सकती हैं, जो गन्दा हो जाती हैं)। इसके बजाए, या तो हमेशा ipython notebook --script या c.FileNotebookManager.save_script = True अपनी कॉन्फ़िगरेशन फ़ाइल में c.FileNotebookManager.save_script = True , ताकि जब आप अपनी नोटबुक सहेजते हैं तो एक (वर्जन योग्य) .py फ़ाइल हमेशा बनाई जाती है।

नोटबुक को पुनर्जीवित करने के लिए (एक रिपो को चेक करने या शाखा स्विच करने के बाद) मैंने निर्देशिका में स्क्रिप्ट py_file_to_notebooks.py जहां मैं अपनी नोटबुक संग्रहीत करता हूं।

अब, एक रेपो की जांच करने के बाद, ipynb फ़ाइलों को उत्पन्न करने के लिए बस python py_file_to_notebooks.py चलाएं। शाखा स्विच करने के बाद, आपको मौजूदा ipynb फ़ाइलों को ओवरराइट करने के लिए python py_file_to_notebooks.py -ov चला सकते हैं।

बस सुरक्षित पक्ष पर रहने के लिए, *.ipynb को अपनी *.ipynb फ़ाइल में भी जोड़ना अच्छा होता है।

संपादित करें: मैं अब ऐसा नहीं करता क्योंकि (ए) जब भी आप शाखा चेक करते हैं तो आपको अपनी नोटबुक को पीई फाइलों से पुन: उत्पन्न करना होगा और (बी) आपके द्वारा खोए गए नोटबुक में मार्कडाउन जैसी अन्य चीजें हैं। मैं इसके बजाय एक गिट फिल्टर का उपयोग कर नोटबुक से उत्पादन पट्टी। यह कैसे करें इस पर चर्चा nbstripout.py


यह जुपीटर एक्सटेंशन उपयोगकर्ताओं को सीधे jithyter नोटबुक को github पर धक्का देने में सक्षम बनाता है।

कृपया यहां देखें

https://github.com/sat28/githubcommit


साइप्रिल रॉसेंट से आईपीथन 3.0 के लिए एक नया समाधान यहां दिया गया है, जो जेसन-आधारित ipymd फ़ाइलों की बजाय फ़ाइलों को चिह्नित करने के लिए जारी है:

https://github.com/rossant/ipymd







jupyter-notebook