在Mac上使用cython和emscripten编译平凡的python程序到javascript

我想从Python使用cython和emscripten生成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++' 

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

 >>> node a.out.js 

我得到一个参考错误

 >>> ReferenceError: _Py_SetProgramName is not defined 

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

有没有人有这方面的经验,或任何build议的修复?

您将需要将embedded式Python库-lpython2.7编译为javacsript,以便它可用于您的javacsript程序。

谢天谢地,这样做的工作已经在empythoned中完成了。 其中提供了一个embedded式的Python编译成Javascript。

你应该可以使用empythoned来提供缺less的_Py_SetProgramName

为了使它工作,我想你需要整个Python由emcc编译为JavaScript,以将正确的库编译成node.js可以处理的代码。 否则,二进制文件库保持不变。 你不能混用。

实际上,如果仔细阅读, emcc会通过警告提醒您。

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

Interesting Posts