5

Jupyter (旧称 iJulia) ノートブックでスクリプトを少しずつ実行してスクリプトを開発するのが好きです。ただし、リモート システムでテストする必要があり、コードだけのコピーを .jl ファイルとして作成する必要がある場合があります。.ipynb ノートブックでコードを実行するワンライナーまたは短いスクリプトを既に書いた人はいますか? そうでない場合は、ある時点でそれに取り組み、ここにコードを投稿します。

4

2 に答える 2

2

ここに私が書いたものがあります:

using JSON

get_code_cells(j::Dict) = filter(x->x["cell_type"] == "code", j["cells"])

function parse_code_cell(c::Dict)
    buf = IOBuffer()
    write(buf, "begin\n")
    map(x->write(buf, x), c["source"])
    write(buf, "\nend")

    src = bytestring(buf)
    parse(src)
end

extract_code(cells::Vector) = Expr[parse_code_cell(c) for c in cells]
extract_code(j::Dict) = extract_code(get_code_cells(j))
eval_code(j::Dict) = map(eval, extract_code(j))


# get filename, then parse to json, then run all code
const fn = ARGS[1]
eval_code(JSON.parsefile(fn))

多くのノートブックで機能するようですが、すべてではありません。具体的には、私が持っていたノートブックを実行できませんでした

using PyCall
@pyimport seaborn as sns

そのコードのチャンクにヒットすると、定義されていないことevalについて不平を言いました( によってエクスポートされますが)。@pyimportPyCall

興味があれば、間違いなくこれをクリーンアップし、いくつかの引数を追加して、適切なコマンド ライン ユーティリティにパッケージ化できます。


編集

さて、まったく違うものに...

このバージョンは にシェルを実行し、それを一時ipython nbconvertファイルに書き込み、その一時ファイルを呼び出しincludeてコードを実行し、一時ファイルを削除します。これはより堅牢である必要があります (他の例が失敗した例に合格しました)。クリーニング/梱包についての同じコメントが適用されます。

const fn = abspath(ARGS[1])
dir = dirname(fn)

# shell out to nbconvert to get a string with code
src = readall(`ipython nbconvert --to script --stdout $fn`)

# Generate random filenamein this directory, write code string to it
script_fn = joinpath(dir, string(randstring(30), ".jl"))
open(script_fn, "w") do f
    write(f, src)
end

# now try to run the file we just write. We do this so we can make sure
# to get to the call `rm(script_fn)` below.
try
    include(script_fn)
catch
    warn("Failed executing script from file")
end

# clean up by deleting the temporary file we created
rm(script_fn)
于 2015-05-16T16:49:43.627 に答える