5

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

接下来我想hello.c使用 emscripten 编译成 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_功能都没有定义。

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

4

2 回答 2

6

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

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

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

于 2013-06-12T11:34:43.143 回答
2

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

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

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

于 2013-06-12T11:25:18.807 回答