संस्करण नियंत्रण के तहत IPython नोटबुक का उपयोग करना


569

संस्करण नियंत्रण के तहत IPython पुस्तिकाओं को रखने के लिए एक अच्छी रणनीति क्या है ?

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

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

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

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

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

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

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

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

टिप्पणियाँ

निकालना (अलग करना) आउटपुट

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

समाचार समूह

मुद्दे

अनुरोधों को खींचो


Github.com/ipython/ipython पर एक मुद्दे के रूप में जोड़ने के लिए एक महान चीज़ की तरह लगता है या एक पुल अनुरोध सबमिट करें जो आपको इस लक्ष्य को आगे बढ़ाने में मदद करता है।
काइल केली

4
एक बार जब आपके पास आउटपुट को हटाने के लिए एक काम करने वाली स्क्रिप्ट होती है, तो आप इसे कमिट करने से पहले स्वचालित रूप से लागू करने के लिए एक Git "क्लीन" फिल्टर का उपयोग कर सकते हैं (साफ / स्मूद फिल्टर देखें)।
मथायस

1
@foobarbecue प्रश्न में असंतोषजनक वर्कअराउंड शामिल हैं: प्रत्येक में कम से कम एक सीमा होती है। अब जब पीआर 4175 को विलय कर दिया गया है, तो एक पूर्ण समाधान संभवतया तैयार किया जा सकता है, लेकिन अभी भी यह करने की आवश्यकता है। जैसे ही मेरे पास कुछ समय होगा, मैं इसे (एक उत्तर के रूप में) करूंगा यदि कोई दूसरा इस बीच कोई संतोषजनक समाधान प्रदान नहीं करता है।
20'13

1
@saroele मुझे अभी तक एक अनुशंसित समाधान नहीं मिला है: मैं --scriptविकल्प के साथ जाने वाला था , लेकिन इसे हटा दिया गया है। मैं इंतजार कर रहा हूं जब तक कि पोस्ट-सेव हुक लागू नहीं हो जाते ( जो योजनाबद्ध हैं ) जिस बिंदु पर मुझे लगता है कि मैं कई तकनीकों को मिलाकर एक स्वीकार्य समाधान प्रदान करने में सक्षम हूं।
22

1
@ मैंफोर्स लगता है कि आपकी टिप्पणी के कुछ दिन बाद ही पीआर का विलय कर दिया गया था। क्या आप या मेरे से अधिक जानकार यहाँ एक उत्तर पोस्ट कर सकते हैं जो दिखाता है कि नई सुविधा का उपयोग कैसे करें?
कोबेहोन

जवाबों:


124

यहाँ git के साथ मेरा समाधान है। यह आपको हमेशा की तरह जोड़ने और कमिट (और अलग-अलग) करने की अनुमति देता है: उन परिचालनों से आपके काम करने वाले पेड़ में बदलाव नहीं होगा, और एक ही समय में (फिर से) एक नोटबुक चलाने से आपके गिट इतिहास में बदलाव नहीं होगा।

यद्यपि यह संभवतः अन्य VCS के लिए अनुकूलित किया जा सकता है, मुझे पता है कि यह आपकी आवश्यकताओं (कम से कम VSC agnosticity) को संतुष्ट नहीं करता है। फिर भी, यह मेरे लिए एकदम सही है, और यद्यपि यह कुछ भी शानदार नहीं है, और कई लोग शायद पहले से ही इसका उपयोग करते हैं, मुझे इसके बारे में स्पष्ट निर्देश नहीं मिले कि इसे कैसे लागू किया जाए। तो यह अन्य लोगों के लिए उपयोगी हो सकता है।

  1. इस सामग्री के साथ एक फ़ाइल को कहीं सहेजें (निम्न के लिए, हमें मान लें ~/bin/ipynb_output_filter.py)
  2. इसे निष्पादन योग्य बनाएं ( chmod +x ~/bin/ipynb_output_filter.py)
  3. ~/.gitattributesनिम्न सामग्री के साथ, फ़ाइल बनाएँ

    *.ipynb    filter=dropoutput_ipynb
    
  4. निम्न आदेश चलाएँ:

    git config --global core.attributesfile ~/.gitattributes
    git config --global filter.dropoutput_ipynb.clean ~/bin/ipynb_output_filter.py
    git config --global filter.dropoutput_ipynb.smudge cat
    

किया हुआ!

सीमाएं:

  • यह केवल गिट के साथ काम करता है
  • गिट में, यदि आप शाखा में हैं somebranchऔर आप करते हैं git checkout otherbranch; git checkout somebranch, तो आप आमतौर पर काम करने वाले पेड़ के अपरिवर्तित होने की उम्मीद करते हैं। इसके बजाय आप नोटबुक के आउटपुट और सेल नंबरिंग को खो देंगे जिसका स्रोत दोनों शाखाओं के बीच भिन्न होता है।
  • सामान्य तौर पर, ग्रेगरी के समाधान के साथ आउटपुट बिल्कुल भी संस्करणबद्ध नहीं किया गया है। हर बार जब आप किसी चेकआउट को शामिल करते हैं, तो इसे फेंकने के लिए नहीं, दृष्टिकोण को अलग-अलग फ़ाइलों में संग्रहीत करके बदला जा सकता है (लेकिन ध्यान दें कि उस समय उपरोक्त कोड चलने पर, प्रतिबद्ध आईडी ज्ञात नहीं है!)। और संभवतः उन्हें संस्करण (लेकिन ध्यान दें कि इसके लिए कुछ अधिक की आवश्यकता होगी git commit notebook_file.ipynb, हालांकि यह कम से कम git diff notebook_file.ipynbबेस 64 कचरे से मुक्त रहेगा )।
  • कहा कि संयोग से, यदि आप कोड खींचते हैं (यानी किसी और द्वारा इस दृष्टिकोण का उपयोग नहीं किया जाता है) जिसमें कुछ आउटपुट होते हैं, तो आउटपुट को सामान्य रूप से चेक किया जाता है। केवल स्थानीय रूप से उत्पादित आउटपुट खो जाता है।

मेरा समाधान इस तथ्य को दर्शाता है कि मैं व्यक्तिगत रूप से उत्पन्न सामान को रखना पसंद नहीं करता हूं - ध्यान दें कि आउटपुट को शामिल करने वाले मर्ज को आउटपुट या आपकी उत्पादकता या दोनों को अमान्य करने की गारंटी है ।

संपादित करें:

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

    **। ipynb फ़िल्टर =

सामग्री के रूप में। स्पष्ट रूप से, उसी तरह से विपरीत करना संभव है: केवल एक विशिष्ट रिपॉजिटरी के लिए फ़िल्टरिंग सक्षम करें ।

  • कोड अब अपने स्वयं के गिट रेपो में बनाए रखा गया है

  • यदि आयात में ऊपर दिए गए निर्देश आयात करते हैं, तो स्क्रिप्ट के पथ से पहले "ipython" जोड़ने का प्रयास करें:

    git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
    

संपादित करें : मई 2016 (अद्यतन फरवरी 2017): वहाँ मेरी स्क्रिप्ट के लिए कई विकल्प हैं - पूर्णता के लिए उन्हें यहां मुझे पता है की एक सूची है: nbstripout ( अन्य वेरिएंट ), nbstrip , JQ


2
आप अपने द्वारा खींचे जाने वाले परिवर्तनों को शामिल करने के मुद्दे से कैसे निपटते हैं? क्या आप आउटपुट के सभी को पुनः प्राप्त करने के साथ रहते हैं? (मुझे लगता है कि यह अपने दूसरे सीमा की एक मिसाल है।)
mforbes

1
@zhermes: यह विस्तारित संस्करण ठीक होना चाहिए
Pietro Battiston

1
क्या बाहरी अंतर उपकरण के साथ इस गिट फ़िल्टर विधि का उपयोग करने का कोई तरीका है? यदि मैं सामान्य कमांड लाइन टूल का उपयोग करता हूं तो फ़िल्टर लागू किया जाता है, लेकिन अगर मैं एक अलग टूल के रूप में मेल्ड का उपयोग कर रहा हूं तो नहीं। stackoverflow.com/q/30329615/578770
FA

1
से बचने के लिए ImportErrorमैं ipython का उपयोग करने के लिए उपर्युक्त में परिवर्तन किया था:git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
chris838

1
Awsome सॉल्यूशन पिएत्रो, धन्यवाद :) मैंने अपने मामले में आपकी स्क्रिप्ट का उपयोग करते समय 2 चीजें बदल दीं: 1) मैंने फिल्टर की घोषणा को तरजीह दी। रेपो की जड़ में। विरोधी के रूप में विरोध किया ~/.gitattributes, अन्य लोगों के पास वही फिल्टर हैं जो मैं 2 के रूप में देखता हूं। ) मैंने regexp को इस रूप में परिभाषित किया है workdir/**/*.ipynb filter=dropoutput_ipynb, और मैंने अपनी अधिकांश नोटबुक को वर्कडिर / => में रखा है, अगर मैं अभी भी आउटपुट के साथ नोटबुक को पुश करना चाहता हूं और जीथब में बुकमार्क करने योग्य प्रतिपादन का आनंद लेना चाहता हूं, तो मैं इसे बस उस फ़ोल्डर के बाहर रखता हूं।
संवत्

63

हमारे पास एक सहयोगी परियोजना है जहां उत्पाद जुपिटर नोटबुक है, और हमने पिछले छह महीनों के लिए एक दृष्टिकोण का उपयोग किया है जो महान काम कर रहा है: हम .pyफ़ाइलों को स्वचालित रूप से सहेजने को सक्रिय करते हैं और दोनों .ipynbफ़ाइलों और फ़ाइलों को ट्रैक करते हैं .py

इस तरह अगर कोई नवीनतम नोटबुक देखना चाहता है / डाउनलोड कर सकता है, जो कि github या nbviewer के माध्यम से कर सकता है, और यदि कोई यह देखना चाहता है कि नोटबुक कोड कैसे बदल गया है, तो वे केवल .pyफाइलों में बदलाव को देख सकते हैं।

के लिए Jupyterनोटबुक सर्वर , इस लाइनों को जोड़कर पूरा किया जा सकता

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(['jupyter', 'nbconvert', '--to', 'script', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save

करने के लिए jupyter_notebook_config.pyफ़ाइल और नोटबुक सर्वर को पुन: प्रारंभ।

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

के लिए Ipython 3नोटबुक सर्वर , इस लाइनों को जोड़कर पूरा किया जा सकता

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

करने के लिए ipython_notebook_config.pyफ़ाइल और नोटबुक सर्वर को पुन: प्रारंभ। ये पंक्तियाँ एक गितुब मुद्दों के उत्तर से हैं जिन पर @minrk ने जवाब दिया है और @dror ने उन्हें अपने SO उत्तर में भी शामिल किया है।

के लिए Ipython 2नोटबुक सर्वर , इस सर्वर का उपयोग शुरू करने के द्वारा पूरा किया जा सकता है:

ipython notebook --script

या लाइन जोड़कर

c.FileNotebookManager.save_script = True

करने के लिए ipython_notebook_config.pyफ़ाइल और नोटबुक सर्वर को पुन: प्रारंभ।

यदि आप सुनिश्चित नहीं हैं कि आपकी ipython_notebook_config.pyफ़ाइल किस निर्देशिका में है , तो आप टाइप कर सकते हैं ipython locate profile default, और यदि आपको वहाँ फ़ाइल नहीं मिलती है, तो आप इसे टाइप करके बना सकते हैं ipython profile create

यहाँ हमारा प्रोजेक्ट जीथब पर है जो इस दृष्टिकोण का उपयोग कर रहा है : और यहाँ एक नोटबुक में हाल के परिवर्तनों की खोज करने का जीथब्यू उदाहरण है

हम इससे बहुत खुश हुए हैं।


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

Ipython 3.x में --scriptपदावनत किया गया है। ipython.org/ipython-doc/3/whatsnew/version3.html
Dror

धन्यवाद @dror, मैंने अपने जवाब को मिनर्क के ipython 3.x समाधान प्रदान करने के लिए अद्यतन किया है क्योंकि आपने यहां भी प्रदान किया है।
रिच साइनेल

10
अद्यतन: इस समाधान को iPython के "द बिग स्प्लिट" की वजह से iPython के संस्करण 4 में तोड़ दिया गया है। इस समाधान को संस्करण 4 में समायोजित jupyter notebook --generate-configकरने के लिए, एक विन्यास फाइल बनाने के लिए कमांड का उपयोग करें । कमांड को jupyter --config-dirपता चलता है कि किस डायरेक्टरी में कॉन्फिग फाइल्स हैं। और @Rich द्वारा दिए गए कोड स्निपेट को नामित फ़ाइल में जोड़ा जाना चाहिए jupyter_notebook_config.py। बाकी पहले की तरह काम करता है।
मोबियस

2
@Mobiusdumpling द्वारा बिंदु के अलावा, के check_call(['ipython'साथ प्रतिस्थापित करें check_call(['jupyter', अन्यथा आपको एक चेतावनी मिलेगी जो कि ipython nbconvertपदावनत है और आपको jupyter nbconvertइसके बजाय उपयोग करना चाहिए । (जुपिटर v4.1.0, iPython v4.1.2)
कटकालस

36

मैंने MinRKs gistnbstripout पर आधारित बनाया है , जो Git और Mercurial (mforbes के लिए धन्यवाद) दोनों का समर्थन करता है। यह या तो कमांड लाइन पर या एक फिल्टर के रूप में स्टैंडअलोन का उपयोग करने का इरादा है, जो आसानी से (संयुक्त राष्ट्र) वर्तमान रिपॉजिटरी में / के माध्यम से स्थापित है ।nbstripout installnbstripout uninstall

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

pip install nbstripout

मैं एक वर्कफ़्लो पर विचार कर रहा हूँ जहाँ मैं दोनों .ipynb और तदनुरूप। मैं diffs के लिए .py का उपयोग करना चाहूंगा - nbstripout सेल निष्पादन काउंटरों से .py फ़ाइल को साफ़ करने में सक्षम होगा (# 1 में [1] में बदलकर [*]], ताकि वे डिफरेंशियल अव्यवस्था न करें या मुझे करना चाहिए ऐसा करने के लिए एक सरल स्क्रिप्ट बनाएं?
Krzysztof Słowiński 12

1
@ KrzysztofSłowiński नहीं, nbstripoutयह उपयोग के मामले को आसानी से समर्थन नहीं करता है क्योंकि यह नोटबुक के JSON प्रारूप पर निर्भर करता है। आप अपने उपयोग के मामले के लिए विशेष स्क्रिप्ट लिखने से बेहतर हैं।
kynan

13

IPython 3.0 के लिए Cyrille Rossant का एक नया समाधान यहां दिया गया है, जो कि json-based ipymd फाइलों के बजाय फाइलों को मार्कडाउन करने के लिए बना रहता है:

https://github.com/rossant/ipymd


अभी तक जुपिटर का समर्थन नहीं किया गया है, ऐसा लगता है।
के।-माइकल ऐय

मैं नवीनतम Jupyter के साथ सफलतापूर्वक ipymd का उपयोग कर रहा हूं - क्या आपको कोई विशिष्ट समस्या या त्रुटि संदेश मिलता है?
साइरिल रॉसेंट

13

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

Jupytext, Jupyter पुस्तिकाओं को विभिन्न पाठ प्रारूपों (लिपियों, मार्काडाउन और आर मार्केडाउन) में बदल सकता है। और इसके विपरीत। यह इन स्वरूपों में से एक के लिए एक नोटबुक को युग्मित करने का विकल्प प्रदान करता है, और स्वचालित रूप से नोटबुक के दो अभ्यावेदन (एक .ipynbऔर एक .md/.py/.Rफ़ाइल) को सिंक्रनाइज़ करने का विकल्प प्रदान करता है ।

मुझे समझाएं कि जुपाइटेक्स्ट उपरोक्त सवालों के जवाब कैसे देता है:

मुझे आउटपुट सहित या बाहर चुनने की अनुमति देता है,

.md/.py/.Rफ़ाइल केवल इनपुट सेल शामिल हैं। आपको हमेशा इस फ़ाइल को ट्रैक करना चाहिए। .ipynbयदि आप आउटपुट को ट्रैक करना चाहते हैं, तो फ़ाइल को ही संस्करण दें ।

अगर मैं नहीं चाहता तो मुझे गलती से आउटपुट करने से रोकता है,

जोड़े *.ipynbको.gitignore

मुझे अपने स्थानीय संस्करण में आउटपुट रखने की अनुमति देता है,

आउटपुट (स्थानीय) .ipynbफ़ाइल में संरक्षित हैं

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

.py/.Rया .mdफ़ाइल पर वह अंतर है जिसे आप खोज रहे हैं

मुझे एक अद्यतन स्वच्छ नोटबुक से अपनी कार्य नोटबुक (जिसमें आउटपुट होता है) को अपडेट करने की अनुमति देता है। (अपडेट करें)

.py/.Rया .mdफ़ाइल का नवीनतम संशोधन खींचें और अपनी नोटबुक को Jupyter (Ctrl + R) में ताज़ा करें। आपको फ़ाइल से मेल खाने वाले आउटपुट के साथ, टेक्स्ट फ़ाइल से नवीनतम इनपुट सेल मिलेंगे .ipynb। कर्नेल प्रभावित नहीं है, जिसका अर्थ है कि आपके स्थानीय चर संरक्षित हैं - आप काम जारी रख सकते हैं जहां आपने इसे छोड़ा था।

क्या मैं Jupytext साथ प्यार कि नोटबुक (एक के रूप किया जा रहा है .py/.Rया .mdफ़ाइल) अपने पसंदीदा IDE में संपादित किया जा सकता। इस दृष्टिकोण के साथ, एक नोटबुक को रिफैक्ट करना आसान हो जाता है। एक बार जब आप कर लेते हैं तो आपको बस ज्यूपिटर में नोटबुक को रीफ्रेश करने की आवश्यकता होती है।

यदि आप इसे आज़माना चाहते हैं: Jupytext को स्थापित करें pip install jupytextऔर अपने Jupyter नोटबुक या लैब संपादक को पुनरारंभ करें। नोटबुक को खोलें जिसे आप संस्करण नियंत्रण करना चाहते हैं, और इसे ज्यूपिटर नोटबुक (या ज्यूपिटर लैब में जुपाइटेक्स्ट कमांड ) में ज्यूपिएक्स्ट मेनू का उपयोग करके एक मार्कडाउन फ़ाइल (या स्क्रिप्ट) में जोड़ दें । अपनी नोटबुक को सहेजें, और आपको दो फाइलें मिलेंगी: मूल , और नोटबुक के प्रस्तावित पाठ प्रतिनिधित्व, जो कि संस्करण नियंत्रण के लिए एकदम सही है!.ipynb

उन लोगों के लिए जो रूचि ले सकते हैं: Jupytext कमांड लाइन पर भी उपलब्ध है ।


13

अद्यतन : अब आप सीधे ज्यूपिटर नोटबुक फ़ाइलों को विजुअल स्टूडियो कोड में संपादित कर सकते हैं । आप नोटबुक या परिवर्तित अजगर फ़ाइल को संपादित करने का विकल्प चुन सकते हैं।

मैंने आखिरकार जुपिटर और गिट प्ले को एक साथ बनाने के लिए एक उत्पादक और सरल तरीका ढूंढ लिया। मैं अभी भी पहले चरणों में हूं, लेकिन मुझे पहले से ही लगता है कि यह अन्य सभी जटिल समाधानों की तुलना में बहुत बेहतर है।

विजुअल स्टूडियो कोड Microsoft का एक अच्छा और खुला स्रोत कोड संपादक है। इसका एक उत्कृष्ट पायथन विस्तार है जो अब आपको अजगर कोड के रूप में ज्यूपिटर नोटबुक आयात करने की अनुमति देता है । अब आप सीधे ज्यूपिटर नोटबुक्स को भी एडिट कर सकते हैं ।

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

एक नोटबुक के साथ VSCode संपादक अजगर में परिवर्तित हो गया

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

बस शुद्ध अजगर कोड जहां आप आसानी से हर एक अंतर की पहचान कर सकते हैं।

मुझे .ipynbअब अपनी फ़ाइलों को संस्करणित करने की भी आवश्यकता नहीं है। *.ipynbमें लाइन लगा सकता हूँ .gitignore

किसी के साथ प्रकाशित करने या साझा करने के लिए नोटबुक बनाने की आवश्यकता है? कोई बात नहीं, बस इंटरएक्टिव अजगर विंडो में निर्यात बटन पर क्लिक करें

एक अजगर फ़ाइल को नोटबुक प्रारूप में निर्यात करना

यदि आप सीधे नोटबुक को संपादित कर रहे हैं, तो अब एक आइकन है Convert and save to a python scriptविजुअल स्टूडियो कोड में ज्यूपिटर आइकन

यहां विज़ुअल स्टूडियो कोड के अंदर एक नोटबुक का स्क्रीनशॉट:

VSCode के अंदर एडिटिंग नोटबुक

मैं इसे सिर्फ एक दिन के लिए उपयोग कर रहा हूं, लेकिन अंत में मैं खुशी के साथ जिपटर का उपयोग कर सकता हूं।

पुनश्च: VSCode कोड पूरा होना जुपिटर की तुलना में काफी बेहतर है।


12

(2017-02)

रणनीतियाँ

  • on_commit ():
    • स्ट्रिप आउटपुट> name.ipynb ( nbstripout,)
    • स्ट्रिप आउटपुट> name.clean.ipynb ( nbstripout,)
    • हमेशा nbconvertअजगर के लिए: name.ipynb.py ( nbconvert)
    • हमेशा मार्कडाउन में बदलें: name.ipynb.md ( nbconvert, ipymd)
  • vcs.configure ():
    • git difftool, mergetool: nbdiff और nbmerge से nbdime

उपकरण

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

11

2016 के बहुत लोकप्रिय उत्तर 2019 में ऐसा करने के बेहतर तरीके की तुलना में असंगत हैक हैं।

कई विकल्प मौजूद हैं, जो सबसे अच्छा सवाल का जवाब है।

Jupytext

पकड़ो Jupytext पर डेटा विज्ञान की दिशा में लेख

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

उल्लेखनीय उल्लेख: वीएस स्टूडियो, nbconvert, nbdime, हाइड्रोजन

मुझे लगता है कि थोड़ा और काम करने के साथ, वीएस स्टूडियो और / या हाइड्रोजन (या इसी तरह) इस वर्कफ़्लो के समाधान में प्रमुख खिलाड़ी बन जाएंगे।


9

बस "jupytext" भर में आते हैं जो एक संपूर्ण समाधान की तरह दिखता है। यह नोटबुक से एक .py फ़ाइल बनाता है और फिर दोनों को सिंक में रखता है। आप आउटपुट को खोए बिना .py फ़ाइल के माध्यम से इनपुट को नियंत्रित, भिन्न और मर्ज कर सकते हैं। जब आप नोटबुक खोलते हैं तो यह इनपुट सेल के लिए .py और आउटपुट के लिए .ipynb का उपयोग करता है। और अगर आप आउटपुट को git में शामिल करना चाहते हैं तो आप सिर्फ ipynb को जोड़ सकते हैं।

https://github.com/mwouts/jupytext


9

चूंकि नोटबुक के लिए संस्करण नियंत्रण को संभालने के लिए बहुत सारी रणनीतियाँ और उपकरण मौजूद हैं, इसलिए मैंने एक उपयुक्त रणनीति चुनने के लिए एक प्रवाह आरेख बनाने की कोशिश की (अप्रैल 2019 को बनाया गया)

संस्करण नियंत्रण रणनीति चुनने के लिए निर्णय प्रवाह


8

जैसा कि बताया गया है, में --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

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


पोस्ट-सेव हुक के उपयोग को प्रदर्शित करने के लिए धन्यवाद। दुर्भाग्य से, जैसा कि उल्लेख किया गया है, .pyफ़ाइल से नोटबुक में वापस आना समस्याग्रस्त है, इसलिए यह दुर्भाग्य से एक पूर्ण समाधान नहीं है। (मैं चाहता हूं कि यह ऐसा ही हो जैसा .pyकि नोटबुक के बजाय फ़ाइलों को
फैलाना

1
धन्यवाद! मैं अब इस चाल का उपयोग कर रहा हूं --script, वर्जन कंट्रोल की परवाह किए बिना व्यवहार को पुन: पेश करने के लिए । मुझे पहली बार में कुछ समस्याएँ हुईं, इसलिए बस अगर मैं किसी को कुछ समय बचा सकता हूं: 1) यदि ipython_notebook_config.pyप्रोफ़ाइल फ़ोल्डर से गायब है, तो ipython profile createइसे जेनरेट करने के लिए चलाएं । 2) यदि ऐसा लगता है जैसे कि पोस्ट-सेव-हुक को अनदेखा किया गया है, --debugतो समस्या का निदान करने के लिए ipython चलाएं । 3) यदि स्क्रिप्ट त्रुटि के साथ विफल हो जाती है ImportError: No module named mistune- सरल स्थापित टकसाल pip install mistune:।
जो

7

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

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

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

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


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

6

मैं बहुत व्यावहारिक दृष्टिकोण का उपयोग करता हूं; जो कई तरफ, कई नोटबुक के लिए अच्छा काम करते हैं। और यह मुझे चारों ओर नोटबुक को 'ट्रांसफर' करने में सक्षम बनाता है। यह विंडोज के लिए यूनिक्स / मैकओएस दोनों के रूप में काम करता है।
अल ने सोचा कि यह सरल है, ऊपर की समस्याओं का समाधान है ...

संकल्पना

मूल रूप से, -फाइल्स को ट्रैक न करें.ipnyb , केवल संबंधित- .pyफाइल्स को। विकल्प के साथ नोटबुक-सर्वर
शुरू करके , उस फ़ाइल को स्वचालित रूप से बनाया / सहेजा जाता है जब नोटबुक सहेजा जाता है।--script

उन .py-files में सभी इनपुट होते हैं; गैर-कोड को टिप्पणियों में सहेजा जाता है, जैसे सेल-बॉर्डर हैं। उन फ़ाइल को नोटबुक में सर्वर से (फिर से) पढ़ा (आयात और खींचा) जा सकता है (पुनः) एक नोटबुक बना सकते हैं। केवल आउटपुट चला गया है; जब तक इसे फिर से नहीं चलाया जाता।

व्यक्तिगत रूप से मैं फाइलों को संस्करण-ट्रैक करने के लिए मर्क्यूरियल का उपयोग करता हूं .py; और उसके लिए सामान्य (कमांड-लाइन) कमांड का उपयोग करें, उसके लिए चेक-इन (ect) करें। अधिकांश अन्य (डी) वीसीएस इसे करने की अनुमति देंगे।

अब इतिहास को ट्रैक करने के लिए इसका सरल; अलग करने के .pyलिए छोटे, पाठ और सरल हैं। एक बार और थोड़ी देर में, हमें एक क्लोन (बस शाखा; वहां दूसरा नोटबुक-विच्छेद शुरू करना होगा), या एक पुराना संस्करण (चेक-इट आउट और नोटबुक-सर्वर में आयात करना), आदि।

सलाह & चाल

  • * .Ipynb को ' .hgignore ' में जोड़ें , इसलिए Mercurial को पता है कि यह उन फ़ाइलों को अनदेखा कर सकता है
  • सर्वर ( --scriptविकल्प के साथ ) शुरू करने के लिए (बैश) स्क्रिप्ट बनाएं और संस्करण-ट्रैक करें
  • किसी नोटबुक को सहेजने से .pyफ़ाइले की बचत होती है , लेकिन इसे चेक नहीं करता है।
    • यह एक खामी है : जिसे कोई भूल सकता है
    • यह एक विशेषता भी है: रिपॉजिटरी-इतिहास को क्लस्ट किए बिना एक नोटबुक (और बाद में जारी रखना) को सहेजना संभव है।

शुभकामनाएं

  • नोटबुक डैशबोर्ड में चेक-इन / ऐड / आदि के लिए बटन रखना अच्छा होगा
  • (उदाहरण के लिए) एक चेकआउट file@date+rev.pyसहायक होना चाहिए यह जोड़ने के लिए बहुत काम करना होगा; और शायद मैं एक बार ऐसा करूंगा। अब तक, मैं बस यही करता हूं।

आप .pyफ़ाइल से वापस नोटबुक में कैसे जाते हैं? मुझे यह दृष्टिकोण पसंद है, लेकिन क्योंकि .ipynb-> .py-> .ipynbसंभावित रूप से हानिपूर्ण है, मैंने इस पर गंभीरता से विचार नहीं किया।
mforbes

यह आसान है: इसे लोड करें, उदाहरण के लिए इसे डी नोटबुक-डैशबोर्ड पर ड्रॉप करके। "आउटपुट डेटा" के अलावा कुछ भी नहीं खोया है
अल्बर्ट

अगर यह सच है, तो मुझे लगता है कि यह विचार के करीब होगा, लेकिन मुझे याद है कि आईपीथॉन ने प्रारूपों .pyसे .ipynbप्रारूपों में परिवर्तन को पूरी तरह से संरक्षित करने के लिए कोई प्रतिबद्धता नहीं की । इसके बारे में एक मुद्दा है - इसलिए शायद यह एक संपूर्ण समाधान का आधार बनेगा।
mforbes

मुझे .pyफ़ाइलों से फ़ाइलों में परिवर्तित करने में कुछ मुश्किल हो रही है .ipynbnbconvertअभी तक इसका समर्थन नहीं करता है, और मेरे पास ipython notebookमैन्युअल रूप से चलाने के बाद से नोटबुक डैशबोर्ड नहीं है । क्या आपके पास इस बैकवर्ड रूपांतरण को लागू करने के बारे में कोई सामान्य सुझाव है?
mforbes

निश्चित रूप से .py-ओ-नोटबुक परिवर्तन गोल-यात्रा का इरादा नहीं है। तो यह वास्तव में एक सामान्य समाधान नहीं हो सकता है, हालांकि यह आपके लिए अच्छा है।
होल्डनवेब

3

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

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')

3

मैंने अजगर पैकेज बनाया है जो इस समस्या को हल करता है

https://github.com/brookisme/gitnb

यह आपके git रेपो के अंदर नोटबुक को ट्रैक / अपडेट / अलग करने के लिए एक git- प्रेरित सिंटैक्स के साथ एक CLI प्रदान करता है।

Heres 'एक उदाहरण है

# add a notebook to be tracked
gitnb add SomeNotebook.ipynb

# check the changes before commiting
gitnb diff SomeNotebook.ipynb

# commit your changes (to your git repo)
gitnb commit -am "I fixed a bug"

ध्यान दें कि अंतिम चरण, जहां मैं "gitnb प्रतिबद्ध" का उपयोग कर रहा हूं, आपके git रेपो के लिए प्रतिबद्ध है। इसके लिए अनिवार्य रूप से एक आवरण

# get the latest changes from your python notebooks
gitnb update

# commit your changes ** this time with the native git commit **
git commit -am "I fixed a bug"

कई और तरीके हैं, और इसे कॉन्फ़िगर किया जा सकता है ताकि इसे प्रत्येक चरण में अधिक या कम उपयोगकर्ता इनपुट की आवश्यकता हो, लेकिन यह सामान्य विचार है।


3

चारों ओर खुदाई करने के बाद, मैंने आखिरकार जुपिटर डॉक्स पर यह अपेक्षाकृत सरल प्री-सेव हुक पाया । यह सेल आउटपुट डेटा को स्ट्रिप्स करता है। आपको इसे 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

से रिच Signell के जवाब :

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


1
मैं यह नोट करूंगा कि यह समाधान डिस्क को किसी भी आउटपुट को कभी नहीं बचाएगा , और संस्करण नियंत्रण मुद्दे से कुछ हद तक स्वतंत्र है।
bdforbes

2

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

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

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

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

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


मुझे यह विचार पसंद आया, लेकिन परीक्षण के बाद, पाया गया कि .pyफ़ाइलों से रूपांतरण .ipynbसमस्याग्रस्त है, विशेष रूप से संस्करण 4 नोटबुक के लिए जिसके लिए अभी तक कोई कनवर्टर नहीं है। एक को वर्तमान में v3 आयातक का उपयोग करने की आवश्यकता होगी और फिर v4 में परिवर्तित हो जाएगी और मैं इस जटिल यात्रा के बारे में थोड़ा चिंतित हूं। इसके अलावा, एक .pyफ़ाइल बहुत अच्छा विकल्प नहीं है अगर नोटबुक मुख्य रूप से जूलिया कोड है! अंत में, --scriptपदावनत किया जाता है तो मुझे लगता है कि हुक जाने का रास्ता है।
18'15

आपके लिंक में git फ़िल्टर समाधान अच्छा है, आपको अपना उत्तर यहाँ से कॉपी करना चाहिए :-)
mcarans

2

ठीक है, इसलिए यह एक चर्चा के अनुसार वर्तमान सबसे अच्छा समाधान है , , कम से कम आईपिनब फ़ाइलों से आउटपुट को स्वचालित रूप से पट्टी करने के लिए एक गिट फ़िल्टर बनाना है।

यहाँ मैंने इसे प्राप्त करने के लिए क्या किया (उस चर्चा से कॉपी किया गया):

जब आप नवीनतम IPython आयात नहीं कर सकते, तो मैंने Cfriedline की nbstripout फ़ाइल को थोड़ा संशोधित किया: https://github.com/petered/plato/blob/fb2f4e252f5027976898920d8e7b8d799e92b/notebooks/config.rip.ig और मेरे रेपो में जोड़ा, की सुविधा देता है में कहना./relative/path/to/strip_notebook_output

इसमें फ़ाइल को जोड़ा गया है।

*.ipynb filter=stripoutput

और एक setup_git_filters.shयुक्त बनाया

git config filter.stripoutput.clean "$(git rev-parse --show-toplevel)/relative/path/to/strip_notebook_output" 
git config filter.stripoutput.smudge cat
git config filter.stripoutput.required true

और भागा source setup_git_filters.sh। फैंसी $ (git Rev-parse ...) बात किसी भी (Unix) मशीन पर अपने रेपो के स्थानीय पथ को खोजने के लिए है।


1

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

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

https://github.com/sat28/githubcommit


क्या आप बता सकते हैं कि यह क्या करता है? विशेष रूप से स्पष्ट नहीं है।
एलेक्स मोनस

@AlexMonras यह सीधे आप एक प्रतिबद्ध संदेश के साथ अपने GitHub रेपो के लिए नोटबुक धक्का कर सकते हैं जहां से jupyter नोटबुक में एक बटन जोड़ देगा
बैठे

1

यह अप्रैल -२०२० है और जुपिटर नोटबुक संस्करण नियंत्रण के लिए बहुत सारी रणनीतियाँ और उपकरण हैं। यहां उन सभी टूल का त्वरित अवलोकन दिया गया है, जिनका आप उपयोग कर सकते हैं,

  • nbdime - स्थानीय diff'ing और नोटबुक के विलय के लिए अच्छा है

  • nbstripout - प्रत्येक कमिट से पहले नोटबुक आउटपुट को स्वचालित रूप से हटाने के लिए एक git फ़िल्टर

  • jupytext - प्रत्येक नोटबुक में एक .py साथी फाइल सिंक'ड रखता है। आप केवल .py फ़ाइलें करते हैं

  • nbconvert - एक पाइथन स्क्रिप्ट या HTML (या दोनों) में नोटबुक को कनवर्ट करें और इन वैकल्पिक फ़ाइल प्रकारों को कमिट करें

  • ReviewNB - किसी भी कमिट या GitHub पर अनुरोध के लिए (अलग-अलग आउटपुट के साथ) नोटबुक दिखाता है। परिवर्तन (स्क्रीनशॉट के नीचे) पर चर्चा करने के लिए एक नोटबुक कोशिकाओं पर टिप्पणियां भी लिख सकता है।

यहाँ छवि विवरण दर्ज करें

अस्वीकरण: मैंने ReviewNB का निर्माण किया।


0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.