如何将用 python 编写的函数编译为 JavaScript (emscripten)?

Posted

技术标签:

【中文标题】如何将用 python 编写的函数编译为 JavaScript (emscripten)?【英文标题】:How compile function written in python to JavaScript (emscripten)? 【发布时间】:2013-11-05 11:53:03 【问题描述】:

我有一个用 python 编写的简单函数,我想移植到 javascript

我已经将 python 2.7 编译成一个 .so 库,所以这不是问题。

我遇到的问题是,在我用 cython 编译程序后,函数名都被打乱了,这意味着我在运行 emcc 时不知道如何保留函数。

有人有使用emscripten将python程序编译成js的经验吗?

任何信息将不胜感激。

注意:我想保留 python 的确切功能,我不想要将 python 程序转换为 javascript 的东西。

【问题讨论】:

有更直接的方法可以将 Python 转换为 JavaScript,这可能更适合您的情况。此处 Python 部分中列出的项目:altjs.org/#ports 和此处:github.com/jashkenas/coffee-script/wiki/… 对您来说可能都是可行的选择。 您可能还会发现这个项目很有趣:github.com/replit/jsrepl。它是 javascript 中的多语言脚本引擎,您可以在浏览器中运行。支持 Python(我认为它是使用 emscripten 移植到的)。因此,您可以将 Python 发送到浏览器,而不是将 Python 编译为 js。 鉴于我在下面找到并发布的 SO 问题,我认为 @slebetman 是对的,即 jsrepl 执行针对其 emscripten 编译的 CPython 解释器运行任意 Python 代码的那种事情将是如果您想保留原始 Python 代码,您最好的选择。 github.com/replit/empythoned 是他们的 Python 特定示例。 您还可以使用 Skulpt 在 JavaScript 中运行 Python 脚本:skulpt.org 【参考方案1】:

另一个问题的答案已被接受,抱怨同样的问题:Cython mangling function names and making it hard to access from C++:Embed python function in C++

接受的答案表明 Cython 根本不适合这种事情,这表明你不能以这种方式做你想做的事:

您将无法以这种方式获得所需的互操作性。如果您打开并检查 hello.c,您将不会在其中的任何地方找到“static int say_hello”。 Cython 旨在让 Python 使用 C 库,而不是让 C 库使用 python。

不接受的下一个答案表明指定 public 不会破坏函数名称,尽管他也提到了链接问题。

# (in the generated C file hello.c)
__PYX_EXTERN_C DL_IMPORT(...) say_hello(...);

值得一试,但如果失败,请考虑 cmets 中的其他选项。

【讨论】:

对,但是我的函数名在通过 cython 后被打乱了,“my_func”现在被称为“_my_func”。

以上是关于如何将用 python 编写的函数编译为 JavaScript (emscripten)?的主要内容,如果未能解决你的问题,请参考以下文章

如何将javascript代码编译为c++或java

使用 Emscripten 将 R 函数编译为 JavaScript

如何将 Python 包编译为 dll

如何用maven将java8写的代码编译为java6平台的

如何将用 ES6 编写的模块发布到 NPM?

如何将python脚本编译为二进制可执行文件