使用macthon上的cython和emscripten将jvial python程序编译为javascript

Eoi*_*ray 5 javascript python cython node.js emscripten

我试图使用cython和emscripten从python生成javascript.

hello.py:

print 'Hello world.'
Run Code Online (Sandbox Code Playgroud)

然后我使用cython将其编译为c

>>> cython --embed hello.py -v
Run Code Online (Sandbox Code Playgroud)

这会生成一个hello.c我编译的文件

>>> gcc hello.c -I/usr/include/python2.7/ -lpython2.7
Run Code Online (Sandbox Code Playgroud)

这适用于gcc或clang.当我执行时,./a.out我得到预期的输出

>>> ./a.out
>>> Hello world
Run Code Online (Sandbox Code Playgroud)

接下来我想hello.c使用emscripten 编译为javascript

>>> emcc hello.c -I/usr/include/python2.7/ -lpython2.7
Run Code Online (Sandbox Code Playgroud)

我明白了

>>> 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++'
Run Code Online (Sandbox Code Playgroud)

它仍然生成一个a.out.js我尝试在node.js中运行的文件

>>> node a.out.js
Run Code Online (Sandbox Code Playgroud)

我收到了参考错误

>>> ReferenceError: _Py_SetProgramName is not defined
Run Code Online (Sandbox Code Playgroud)

我尝试稍微更改生成的javscript,但基本上我认为所有_Py_函数都没有定义.

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

bri*_*ice 6

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

值得庆幸的是,这项工作已经在empythoned中完成.这提供了一个嵌入式python编译为Javascript.

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


Man*_*eru 2

为了让它工作,我认为你需要将整个Python编译为emccJavaScript,以便将适当的库编译成node.js可以处理的代码。否则,您拥有的二进制库将保持不变。你不能把它混为一谈。

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

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