Open asukaminato0721 opened 4 years ago
这是俩问题,第一步我感觉就这样用 Notebook2Jupyter[nb_NotebookObject]
就可以了。第二步是要生成py代码吗,这个不容易吧,大概是先用AST生成python代码再替换关键字?我不会这些。
现在我的工序是:
.py
脚本直接在剪贴板转换代码,简单粗暴,直接替换括号+关键字,然后小问题人工修补.ipynb
运算。 但这样只做了一行,比如对于 integrate 这种巨型函数,太耗时了。
我在想,先把 .nb
变成 .ipynb
(帮助是 nb 文件,应该能转换),然后 .ipynb
本质是个 .json
文件,我在里面就能批量执行第二步。(正则 .*?
替换)
那个包我试了 <<
,没法成功导入。不知道是不是操作不对。而且看样子也没做 .paclet
包。
实在不行你就把包里代码手动计算一遍。有一点要注意,那个包转换的应该是Default样式的笔记本,而帮助文档用的是Reference样式表,可能包含那个包所不支持的样式。
我。。。应该是试出来了?
https://github.com/GalAster/JupyterConvert/blob/master/Kernel/Notebook2Jupyter.m
把这个文件的代码复制到 .m
里再 <<
进来
Notebook2Jupyter
就变黑了。
但是
然后我搜了一下,在 info 看到了 MathematicaVersion -> "12.0+"
, 所以估计是 12.0 增加了功能,11.3 就不行了。(没有 12.0+ 的版本,无法测试)
打开 ipynb
。对每一个 code
cell,如果 execution_count == null
就处理,也可以强制都处理(毕竟某些 cell 可能有错误、改动,人工排查不现实)。
source
,判断每一句的作用,适当处理后 eval()
。结果存到变量 v
。outputs
。data
中的 key 都是 MIME 类型,那么
text/latex
存 r'${ \displaystyle ' + latex(v) + r' }$'
。text/plain
存 str(v)
。v
是图片,不妨先 save()
,再读取出来,base64 编码,末尾似乎需要加个换行 (\n
)。execution_count
、output_type
等。需要注意,Jupyter 默认的缩进是 1 个空格。JSON serializer 也要这样设置 (indent=1
)。
参看
这个 issue 的起点令我困惑。我想请教一下,为什么要这样做?
按我的理解,这个项目想要参考 Wolfram Documentation 的风格,给 SymPy 写一套 manual。那么,为什么不直接编辑 ipynb
。
MMA 的帮助文档里唯一能用上的就是 Examples,整本转换,再滤出需要的内容,恐怕不比打开手抄简单。何不搜索所有 Input
Cell 并提取?
NotebookFind[(* obj *), "Input", All, CellStyle]
参看
构建 Wolfram 的 AST 这步,可以参考 WolframResearch/codeparser。
鉴于这里的出现的代码都比较简单,自己从头构建也无妨。先用 HoldForm[FullForm[]]
处理一遍,可能会方便些:
至于变换到 Python,我也不知道该怎么办。Wolfram 的函数与 SymPy 的函数不是一一对应的,这是个大问题。
截至目前所有的代码都是直接手敲,工作量过于巨大+耗时。
所以思路就是,
.nb
->.ipynb
for mma ->.ipynb
for python找到了这个问题回答,并找到了酱紫君写的项目 . 但是他没写使用方法。。。 目前还需要继续探索。
以及一个简单的 Python 脚本,用于快速但不鲁棒地转换代码。(sympy 内置的 Mathematica 转换太弱了,我提过几个 pr)