2016-05-02 63 views
4

我有一個小程序,基本上做各種統計計算並打印結果和圖表。ipython輸出自動化爲pdf

目前,獲取我的程序的一個很好的pdf輸出的便捷方式是使用魔術命令%matplotlib inline在Jupyter IPython Notebook中運行我的代碼,並通過執行「PDF via LaTex(.pdf)」保存爲pdf「

但是,問題是我必須手動執行它,每次我運行該程序。另外,我無法將該程序作爲二進制可執行文件提供給其他人,這是我的最終目標。

有沒有辦法做到這一點編程?爲了清楚起見,我所需要的只是以pdf格式輸出我的程序,以便在可執行文件運行時輸出爲pdf。 我不希望最終用戶創建ipython筆記本。最終用戶將無法訪問源代碼。

enter image description here

回答

6

截至目前有沒有一種編程語言的API筆記本電腦轉換爲PDF。但是,存在名爲nbconvert的命令行實用程序。它具有與Web界面格式轉換器相同的功能。要轉換爲PDF,您可以做jupyter nbconvert notebook.ipynb --to pdf

幸運的是,Python有一個方便的subprocess module,它允許你產生新的進程,檢查它們的輸入和輸出,並獲得它們的返回代碼。所以你可以做這樣的事情:

import subprocess 
subprocess.call("jupyter nbconvert notebook.ipynb --to pdf") 

有點hacky的方式,但它會工作。如果您使用的是Windows,則可能需要將額外的kwarg shell=True添加到subprocess.call()

+0

nbconvert也有一個可以使用的Python API,雖然對於簡單的情況比命令行要複雜一些。 http://nbconvert.readthedocs.io/en/latest/nbconvert_library.html –

+0

此解決方案不起作用,因爲這需要用戶創建ipython筆記本。 – user3817518

+0

'subprocess.call'不接受字符串。你應該通過'subprocess.call(shlex.split(「jupyter nbconvert notebook.ipynb - to pdf」))' – Temak

1

如果您有IPython筆記本,則可以製作一個首先執行並生成PDF的小型python或bash腳本。對我來說,這個bash腳本的工作原理:

jupyter nbconvert --ExecutePreprocessor.timeout=500 --to notebook --execute my_file.ipynb 
jupyter nbconvert --to pdf my_file.nbconvert.ipynb 
rm my_file.nbconvert.ipynb 

如果您想自定義使用模板的輸出,我發現第一個轉換文件,以降價,然後用pandoc創建一個PDF避免了一些問題:

jupyter nbconvert --ExecutePreprocessor.timeout=500 --to notebook --execute my_file.ipynb 
jupyter nbconvert --to markdown my_file.nbconvert.ipynb --template="mytemplate.tpl" 
pandoc --toc --template=mytemplate.tex markdown my_file.nbconvert.ipynb --latex-engine=pdflatex -o final file.pdf