簡體   English   中英

在 mac 上使用 cython 和 emscripten 將簡單的 python 程序編譯為 javascript

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

我正在嘗試使用 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時,我得到了預期的 output

>>> ./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

我嘗試稍微更改生成的 javscript,但基本上我認為所有_Py_函數都沒有定義。

有沒有人有這方面的經驗,或任何建議的修復?

您還需要將embedabble python庫-lpython2.7編譯為javacsript,以便它可用於您的javacsript程序。

值得慶幸的是,這項工作已經在empythoned中完成。 這提供了一個嵌入式python編譯為Javascript。

您應該能夠使用empythoned來提供缺少的_Py_SetProgramName

為了使它工作,我認為你需要由emcc編譯為JavaScript的整個Python,以便將正確的庫編譯成node.js可以處理的代碼。 否則你保持完整的二進制庫。 你不能混合它。

事實上,如果您仔細閱讀, emcc會通過警告通知您。

在編譯自己的腳本之前,您需要了解如何將Python cross-compile為javascript。 這已經完成了,因為我在repl.it上看到了它。

Pyodide 終於(多年后)妥善解決了這個問題。 請參閱https://pyodide.org/en/stable/ Pyodide的許多組件部分使用 Cython 編寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM