在mac上使用cython和emscripten编译琐碎的python程序到javascript

Compiling trivial python program to javascript using cython and emscripten on mac

本文关键字:python 程序 javascript 编译 emscripten mac cython      更新时间:2023-09-26

我正在尝试使用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

我试着改变生成的javascript一点点,但基本上我认为所有的_Py_函数都没有定义。

有没有人对此有任何经验,或任何建议的修复?

您还需要将可嵌入的python库-lpython2.7编译为javacscript,以便它可用于您的javacscript程序。

值得庆幸的是,这样做的工作已经在python中完成了。它提供了一个编译成Javascript的嵌入式python。

您应该能够使用python来提供缺失的_Py_SetProgramName

为了使其工作,我认为您需要由emcc编译到JavaScript的整个Python,以便将适当的库编译成node.js可以处理的代码。否则,您拥有的二进制库将保持完整。你不能把它们混在一起。

事实上,如果你仔细阅读emcc,它会用警告通知你。

在编译自己的脚本之前,您需要了解如何将Python cross-compile转换为javascript。这已经完成了,因为我在replit上看到了。

Pyodide终于(多年后)妥善解决了这个问题。参见https://pyodide.org/en/stable/pyoide的许多组件都是部分使用Cython编写的。