在 mac 上使用 cython 和 emscripten 将简单的 python 程序编译为 javascript
Posted
技术标签:
【中文标题】在 mac 上使用 cython 和 emscripten 将简单的 python 程序编译为 javascript【英文标题】:Compiling trivial python program to javascript using cython and emscripten on mac 【发布时间】:2013-06-12 11:15:00 【问题描述】:我正在尝试使用 cython 和 emscripten 从 python 生成 javascript。
hello.py
:
print 'Hello world.'
然后我使用 cython 将其编译为 c
>>> cython --embed hello.py -v
这会生成一个hello.c
文件,我用它来编译
>>> gcc hello.c -I/usr/include/python2.7/ -lpython2.7
这适用于 gcc 或 clang。
当我执行 ./a.out
时,我得到了预期的输出
>>> ./a.out
>>> Hello world
接下来我想使用 emscripten 将 hello.c
编译为 javascript
>>> emcc hello.c -I/usr/include/python2.7/ -lpython2.7
我明白了
>>> WARNING emcc: -I or -L of an absolute path encountered.
>>> If this is to a local system header/library, it may cause problems
>>> (local system files make sense for compiling natively on your system,
>>> but not necessarily to JavaScript)
>>> clang: warning: argument unused during compilation: '-nostdinc++'
它仍然会生成一个 a.out.js
文件,我尝试在 node.js 中运行该文件
>>> node a.out.js
我得到一个参考错误
>>> ReferenceError: _Py_SetProgramName is not defined
我尝试稍微改变一下生成的 javscript,但基本上我认为所有的_Py_
函数都没有定义。
有没有人有这方面的经验,或任何建议的修复?
【问题讨论】:
哇。 Python 通过 C 到 Javascript?想知道您的用例是什么? 物理模拟用 python 和 numpy 编写,我很想进入浏览器。我也很想用 numpy 编写向量操作并用 Three.js 进行可视化,但那是非常一厢情愿的想法! Numpy 很难移植到 javascript。它使用了一些用FORTRAN 编写的原生库。 建议在服务器上运行模拟并通过 websocket 更新可视化。过去我做过同样的事情,WebGL 只是使用 python、sockJS 和龙卷风反应器作为服务器在服务器上运行的物理引擎的演示前端。效果很好。 也许,你可能是对的,谢谢你的建议。 【参考方案1】:您还需要将可嵌入 python 库 -lpython2.7
编译为 javacsript,以便它可用于您的 javacsript 程序。
谢天谢地,empythoned 已经完成了这项工作。它提供了一个编译为 Javascript 的嵌入式 python。
您应该可以使用 empythoned 来提供缺少的_Py_SetProgramName
【讨论】:
【参考方案2】:为了使其正常工作,我认为您需要将整个 Python 由 emcc
编译为 JavaScript,以便将适当的库编译为 node.js
可以处理的代码。否则,您拥有的二进制库将保持不变。你不能混用。
事实上,emcc
会通过警告通知你,如果你仔细阅读的话。
在编译您自己的脚本之前,您需要了解如何将cross-compile
Python 转换为 javascript。这已经完成了,因为我在 repl.it 上看到了。
【讨论】:
以上是关于在 mac 上使用 cython 和 emscripten 将简单的 python 程序编译为 javascript的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Cythonize() 上使用 annotate=True
在 Mac OS 10.6 (python 2.6) 上安装/构建 pymssql
Cython 在 `double (s.time_since_epoch().count())` 上返回 `Cython.Compiler.Errors.CompileError`