在 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-compilePython 转换为 javascript。这已经完成了,因为我在 repl.it 上看到了。

【讨论】:

以上是关于在 mac 上使用 cython 和 emscripten 将简单的 python 程序编译为 javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cythonize() 上使用 annotate=True

在 Mac OS 10.6 (python 2.6) 上安装/构建 pymssql

无法将 cpplist 导入 Cython?

Cython 在 `double (s.time_since_epoch().count())` 上返回 `Cython.Compiler.Errors.CompileError`

使用 Cython 和 C++ 组织项目

python导入的cython错误