मैं कमांड लाइन के माध्यम से एक अजगर नोटबुक को पायथन फ़ाइल में कैसे परिवर्तित करूं?


258

मैं * .ipynb फ़ाइलों को सत्य के स्रोत के रूप में और प्रोग्रामिक रूप से 'कंपाइलिंग' के रूप में अनुसूचित नौकरियों / कार्यों के लिए .py फ़ाइलों का उपयोग करके देख रहा हूँ ।

जिस तरह से मैं ऐसा करने के लिए समझती हूं वह जीयूआई के माध्यम से है। वहाँ कमांड लाइन के माध्यम से यह करने के लिए एक रास्ता है?


1
"सत्य के स्रोत" से आपका क्या तात्पर्य है? IPython नोटबुक सिर्फ json फ़ाइलें हैं। आप उन्हें लोड कर सकते हैं और पायथन शब्दकोशों के रूप में हेरफेर कर सकते हैं। स्रोत कोड के लिए आपको 'कोड' के बराबर होने वाली inputकुंजियों को पुनरावृत्त करना चाहिए cell_type। इस योजना
थीटा

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

1
@StefanKrawczyk क्या आप स्वीकार किए जाते हैं कि कृपया एक aswer चिह्नित कर सकते हैं? मैं wwwilliam की asnwer की सिफारिश करूंगा
पशराम बशीरी

जवाबों:


413

यदि आप हर बार सहेजने के लिए एक पायथन स्क्रिप्ट का उत्पादन नहीं करना चाहते हैं, या आप आईपीथॉन कर्नेल को पुनः आरंभ नहीं करना चाहते हैं:

पर कमांड लाइन , आप उपयोग कर सकते हैं nbconvert:

$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

एक हैक के एक बिट के रूप में, आप पूर्व-लंबित !(किसी भी कमांड लाइन के लिए उपयोग) द्वारा एक IPython नोटबुक में उपरोक्त कमांड को कॉल कर सकते हैं । नोटबुक के अंदर:

!jupyter nbconvert --to script config_template.ipynb

इससे पहले --to scriptकिया गया था जोड़ा , विकल्प था --to pythonया --to=pythonहै, लेकिन यह किया गया था नाम बदलकर एक भाषा-नास्तिक नोटबुक प्रणाली की ओर कदम में।


8
यदि आप हर एक को बचाना चाहते हैं, jupyterतो आप nbconvertपहले से या बाद में बचाने वाले हुक के माध्यम से ट्रिगर कर सकते हैं: ContentsManager.pre_save_hookपेट FileContentsManager.post_save_hook। आप एक पोस्ट-बचत हुक jupyter nbconvert --to script [notebook]
जोड़ेंगे

3
वहाँ रिवर्स करने के लिए एक तरीका है अर्थात् एक अजगर स्क्रिप्ट से एक नोटबुक में परिवर्तित। पूर्व के लिए - कुछ विशेष डॉक्ट्रिंग हैं जिन्हें कोशिकाओं में पार्स किया जाता है?
सुजेन शाह

3
सभी नोटबुक को एक फ़ोल्डर में परिवर्तित करेंjupyter nbconvert --to script /path/to/notebooks/*.ipynb
ओपनवॉन्क

8
धन्यवाद, यह काम करता है!, लेकिन क्या होगा अगर मुझे # In[ ]:स्क्रिप्ट में टाइप सामान नहीं चाहिए , मैं चाहता हूं कि यह साफ हो। क्या उसे करने का कोई तरीका है?
ऋषभ अग्रहरी

1
@ ऋषभअगारी यहाँ देखें, आप बस लिंटर जुपाइटर-notebook.readthedocs.io/en/stable/extending/…
MichaelChirico

77

यदि आप सभी *.ipynbफ़ाइलों को वर्तमान निर्देशिका से अजगर स्क्रिप्ट में बदलना चाहते हैं , तो आप इस तरह से कमांड चला सकते हैं:

jupyter nbconvert --to script *.ipynb

19

यहाँ ipython का उपयोग किए बिना V3 या V4 ipynb से कोड निकालने का एक त्वरित और गंदा तरीका है। यह सेल प्रकार आदि की जांच नहीं करता है।

import sys,json

f = open(sys.argv[1], 'r') #input.ipynb
j = json.load(f)
of = open(sys.argv[2], 'w') #output.py
if j["nbformat"] >=4:
        for i,cell in enumerate(j["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["source"]:
                        of.write(line)
                of.write('\n\n')
else:
        for i,cell in enumerate(j["worksheets"][0]["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["input"]:
                        of.write(line)
                of.write('\n\n')

of.close()

1
सबसे अच्छा जवाब अगर आप किसी भी ज्यूपिटर टूल को इंस्टॉल नहीं करना चाहते हैं।
डेकोरेट

1
यह मुझे पंसद है। लेकिन मुझे पता चला कि जब मैं Jupyter पुस्तिकाओं से .py प्रारूप डाउनलोड करता हूं, तो यह विंडोज़ पर होने के बावजूद UNIX लाइन अंत का उपयोग करता है। समान उत्पन्न करने के लिए, newlines='\n'ओपन आउटपुट फ़ाइल कॉल में तीसरे तर्क के रूप में जोड़ें । (पायथन 3.x)
रुफुसवीस

16

पिछले उदाहरण के बाद लेकिन नए nbformat परिवाद संस्करण के साथ :

import nbformat
from nbconvert import PythonExporter

def convertNotebook(notebookPath, modulePath):

  with open(notebookPath) as fh:
    nb = nbformat.reads(fh.read(), nbformat.NO_CONVERT)

  exporter = PythonExporter()
  source, meta = exporter.from_notebook_node(nb)

  with open(modulePath, 'w+') as fh:
    fh.writelines(source.encode('utf-8'))

कोड की अंतिम पंक्ति, fh.writelines (source.encode ('utf-8')) 'TypeError: write () तर्क को स्ट्रिंग होना चाहिए, न कि int' fh.writelines (स्रोत) काम करता है।
बैरीक

6

आप इसे IPython API से कर सकते हैं।

from IPython.nbformat import current as nbformat
from IPython.nbconvert import PythonExporter

filepath = 'path/to/my_notebook.ipynb'
export_path = 'path/to/my_notebook.py'

with open(filepath) as fh:
    nb = nbformat.reads_json(fh.read())

exporter = PythonExporter()

# source is a tuple of python source code
# meta contains metadata
source, meta = exporter.from_notebook_node(nb)

with open(export_path, 'w+') as fh:
    fh.writelines(source)

4

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

jupytext --to py notebook.ipynb                 # convert notebook.ipynb to a .py file
jupytext --to notebook notebook.py              # convert notebook.py to an .ipynb file with no outputs
jupytext --to notebook --execute notebook.py    # convert notebook.py to an .ipynb file and run it 

जाहिरा तौर पर ipynb-py-Convert भी है, यहां देखें ।
वेन

'jupytext' को आंतरिक या बाहरी कमांड, ऑपरेशनल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता नहीं मिली है।
अमीन चादी

क्या आपने इसे @AmineChadi स्थापित किया है। यहाँ देखें कि कैसे करना है। यदि आप इसे अपने कमांड लाइन इंटरफ़ेस के रूप में नोटबुक के माध्यम से उपयोग कर रहे हैं, तो आप बस %pip install jupytextअपनी नोटबुक में चला सकते हैं ।
वेन

3

वर्तमान निर्देशिका में सभी * .ipynb प्रारूप फ़ाइलों को परिवर्तित करने के लिए पुनरावर्ती लिपियों के लिए:

for i in *.ipynb **/*.ipynb; do 
    echo "$i"
    jupyter nbconvert  "$i" "$i"
done

3
मुझे --to scriptबृहस्पति 4.4.0 में डिफ़ॉल्ट HTML आउटपुट से बचने के लिए तर्क जोड़ना था ।
trojjer

0

मुझे यह समस्या थी और इसका समाधान ऑनलाइन खोजने की कोशिश की। हालाँकि मुझे कुछ समाधान मिले, फिर भी उनमें कुछ समस्याएँ हैं, उदाहरण के लिए, Untitled.txtजब आप डैशबोर्ड से एक नई नोटबुक शुरू करते हैं तो कष्टप्रद ऑटो-निर्माण।

तो आखिरकार मैंने अपना समाधान लिखा :

import io
import os
import re
from nbconvert.exporters.script import ScriptExporter
from notebook.utils import to_api_path


def script_post_save(model, os_path, contents_manager, **kwargs):
    """Save a copy of notebook to the corresponding language source script.

    For example, when you save a `foo.ipynb` file, a corresponding `foo.py`
    python script will also be saved in the same directory.

    However, existing config files I found online (including the one written in
    the official documentation), will also create an `Untitile.txt` file when
    you create a new notebook, even if you have not pressed the "save" button.
    This is annoying because we usually will rename the notebook with a more
    meaningful name later, and now we have to rename the generated script file,
    too!

    Therefore we make a change here to filter out the newly created notebooks
    by checking their names. For a notebook which has not been given a name,
    i.e., its name is `Untitled.*`, the corresponding source script will not be
    saved. Note that the behavior also applies even if you manually save an
    "Untitled" notebook. The rationale is that we usually do not want to save
    scripts with the useless "Untitled" names.
    """
    # only process for notebooks
    if model["type"] != "notebook":
        return

    script_exporter = ScriptExporter(parent=contents_manager)
    base, __ = os.path.splitext(os_path)

    # do nothing if the notebook name ends with `Untitled[0-9]*`
    regex = re.compile(r"Untitled[0-9]*$")
    if regex.search(base):
        return

    script, resources = script_exporter.from_filename(os_path)
    script_fname = base + resources.get('output_extension', '.txt')

    log = contents_manager.log
    log.info("Saving script at /%s",
             to_api_path(script_fname, contents_manager.root_dir))

    with io.open(script_fname, "w", encoding="utf-8") as f:
        f.write(script)

c.FileContentsManager.post_save_hook = script_post_save

इस स्क्रिप्ट का उपयोग करने के लिए, आप इसे ~/.jupyter/jupyter_notebook_config.py:) में जोड़ सकते हैं

ध्यान दें कि काम करने के लिए आपको बृहस्पति नोटबुक / प्रयोगशाला को फिर से शुरू करना पड़ सकता है।


0

वहाँ एक बहुत अच्छा पैकेज है जिसे nb_dev कहा जाता है जो जुपिटर नोटबुक में पायथन पैकेज को संलेखन के लिए बनाया गया है। जैसे nbconvert,कि यह नोटबुक को एक .py फ़ाइल में बदल सकता है, लेकिन यह अधिक लचीला और शक्तिशाली है क्योंकि इसमें आपके पास परीक्षण, प्रलेखन विकसित करने और PyPI पर पैकेज रजिस्टर करने में मदद करने के लिए बहुत अच्छी अतिरिक्त संलेखन सुविधाएँ हैं। यह fast.ai लोगों द्वारा विकसित किया गया था।

इसमें सीखने की अवस्था थोड़ी है, लेकिन प्रलेखन अच्छा है और यह समग्र रूप से कठिन नहीं है।

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