IPython Not Defterini komut satırı üzerinden Python dosyasına nasıl dönüştürebilirim?


258

* .İpynb dosyalarını gerçeğin kaynağı olarak kullanmaya ve programlı olarak programlanmış işler / görevler için .py dosyalarına 'derleme' bakıyorum .

Bunu yapmanın tek yolu GUI. Komut satırı üzerinden yapmanın bir yolu var mı?


1
"Gerçeğin kaynağı" ile ne demek istiyorsun? IPython dizüstü bilgisayarlar sadece json dosyalarıdır. Bunları yükleyebilir ve Python sözlükleri olarak kullanabilirsiniz. Kaynak kodu için , 'koda' eşit olan inputanahtarları yinelemelisiniz cell_type. Bu şemaya
teta

1
Peki .ipynb'i .py dosyalarında değil depoda saklamak istiyorum. Böylece bir 'derleme adımı' olarak .ipynb'yi otomatik sistem tarafından gerçek kullanım için .py dosyalarına dönüştürürüm. Haklısın, sadece json'u yükleyebilir ve sadece kod hücrelerini çıkarabilirdim, ama benim için zaten bunu yapan bir şey olup olmadığını merak ediyordum :)
Stefan Krawczyk

1
@StefanKrawczyk Lütfen bir askıyı kabul edilmiş olarak işaretleyebilir misiniz? Wwwilliam'ın asnwer
pedram bashiri

Yanıtlar:


415

Her kaydettiğinizde bir Python betiği çıkarmak istemiyorsanız veya IPython çekirdeğini yeniden başlatmak istemiyorsanız:

Açık komut satırında şunları kullanabilirsiniz nbconvert:

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

Bir hack biraz olarak, hatta yukarıdaki komutu çağırabilir içinde bir ipython notebook öncesi bekleyen tarafından !(herhangi bir komut satırı argümanı için kullanılır). Bir not defterinin içinde:

!jupyter nbconvert --to script config_template.ipynb

Önce --to scriptedildi eklendi , seçenek --to pythonya --to=pythonama oldu değiştirildi bir dil agnostik dizüstü sistemine doğru hareket.


8
Eğer bir tane istiyorum DO ise her kaydetmek jupytertetikleyebileceğiniz nbconvert: öncesi veya kanca sonrası tasarrufu yoluyla ContentsManager.pre_save_hookabd FileContentsManager.post_save_hook. Kaydetme sonrası bir kanca jupyter nbconvert --to script [notebook]
eklersiniz

3
Ters yani python betiğinden not defterine dönüştürmek için bir yolu var. Hücrelere ayrıştırılmış bazı uzman öğretilere sahip olmak için?
Sujen Shah

3
bir klasördeki tüm not defterlerini dönüştürmekjupyter nbconvert --to script /path/to/notebooks/*.ipynb
openwonk

8
Teşekkürler, işe yarıyor!, Ama # In[ ]:senaryoda tür şeyler istemiyorsam, temiz olmasını istiyorum. Bunu yapmanın bir yolu var mı?
Rishabh Agrahari

1
@RishabhAgrahari burada kontrol edin, sadece linter jupyter-notebook.readthedocs.io/en/stable/extending/…
MichaelChirico

77

*.ipynbGeçerli dizindeki tüm dosyaları python komut dosyasına dönüştürmek istiyorsanız , komutu şu şekilde çalıştırabilirsiniz:

jupyter nbconvert --to script *.ipynb

19

İşte ipython kullanmadan V3 veya V4 ipynb'den kodu çıkarmanın hızlı ve kirli bir yolu. Hücre tiplerini vb. Kontrol etmez.

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
Jupyter araçlarından herhangi birini yüklemek istemiyorsanız en iyi yanıt.
dacracot

1
Bunu severim. Ama Jupyter dizüstü bilgisayarlarından .py formatını indirdiğimde, pencerede olsam bile UNIX satır sonlarını kullandığını öğrendim. Aynı şeyi oluşturmak için newlines='\n', açık çıktı dosyası çağrısına üçüncü bir bağımsız değişken olarak ekleyin . (Python 3.x)
RufusVS

16

Önceki örneği takip ederek ancak yeni nbformat lib sürümü ile :

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

'nin son kod satırı, fh.writelines (source.encode (' utf-8 '))' TypeError: write () argümanını değil int 'değil fh.writelines (source) çalışır.
BarryC

6

Bunu IPython API'sından yapabilirsiniz.

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 , bu tür dönüşümler için araç zincirinizde olması güzel. Yalnızca bir not defterinden bir komut dosyasına dönüştürmekle kalmaz, aynı zamanda komut dosyasından not defterine de geri dönebilirsiniz. Ve hatta o defter idam formunda üretti.

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 

Görünüşe göre ipynb-py-convert de var, buraya bakın .
Wayne

'jupytext' dahili veya harici bir komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmıyor. ???
Amine Chadi

@AmineChadi'yi yüklediniz mi? Bunu nasıl yapacağınız için buraya bakın . Komut satırı arabiriminiz olarak bir dizüstü bilgisayar aracılığıyla kullanıyorsanız %pip install jupytext, not defterinizde çalıştırabilirsiniz .
Wayne

3

Geçerli dizindeki tüm * .ipynb biçimindeki dosyaları yinelemeli olarak python komut dosyalarına dönüştürmek için:

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

3
--to scriptJüpiter 4.4.0 varsayılan HTML çıkışı önlemek için argüman eklemek zorunda kaldı .
trojjer

0

Bu sorunu yaşadım ve çözümü çevrimiçi bulmaya çalıştım. Bazı çözümler bulmama rağmen, hala bazı sorunlar var, örneğin, Untitled.txtgösterge tablosundan yeni bir not defteri başlattığınızda sinir bozucu otomatik oluşturma.

Sonunda kendi çözümümü yazdım :

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

Bu komut dosyasını kullanmak için şu komut dosyasına ekleyebilirsiniz ~/.jupyter/jupyter_notebook_config.py:)

Çalışması için jupyter dizüstü bilgisayarı / laboratuvarı yeniden başlatmanız gerekebileceğini unutmayın.


0

Jupyter Notebook'larda Python paketleri yazmak için tasarlanmış nb_dev adında çok güzel bir paket var . Gibi nbconvert,bir .py dosyası içine bir defteri açabilirsiniz, ama güzel ilave yazma bir sürü testler, dokümantasyon geliştirmelerine yardımcı ve PyPI üzerinde paketleri kayıt özelliklerine sahiptir çünkü daha esnek ve güçlüdür. Fast.ai millet tarafından geliştirilmiştir.

Biraz öğrenme eğrisi var, ancak dokümantasyon iyi ve genel olarak zor değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.