微軟最近開源了 MarkItDown,這是一個將 Office 文件轉換為 Markdown 格式的程式。該專案一發布就迅速登上了 GitHub 的熱門榜。
但是,由於 MarkItDown 是一個 Python 程序,因此對於非技術用戶來說使用起來可能具有挑戰性。為了解決這個問題,我想到了使用WebAssembly技術,直接在瀏覽器中執行Python程式碼。
Pyodide 是一個在瀏覽器中運行 Python 的開源程序,使用 WebAssembly 移植 CPython,因此支援所有 Python 語法。 Cloudflare 的 Python Workers 也使用 Pyodide。
Pyodide 是 CPython 到 WebAssembly/Emscripten 的連接埠。
Pyodide 使得使用 micropip 在瀏覽器中安裝和執行 Python 套件成為可能。支援 PyPI 上可用的任何帶輪子的純 Python 套件。
許多具有 C 擴充功能的軟體包也已被移植以與 Pyodide 一起使用。其中包括 regex、PyYAML、lxml 等常見套件和 NumPy、pandas、SciPy、Matplotlib 和 scikit-learn 等科學 Python 套件。 Pyodide 附帶強大的 JavaScript ⟺ Python 外部函數接口,可讓您以最小的摩擦在程式碼中自由地混合這些語言。這包括對錯誤處理、非同步/等待等的全面支援。
在瀏覽器中使用時,Python 具有對 Web API 的完全存取權。
嘗試運行 MarkItDown 出奇的順利,證明 WebAssembly 確實是瀏覽器的未來。
面臨的主要挑戰與解決方案:
檔案傳輸問題:如何將使用者選擇的檔案傳遞到 Worker 中的 Python 執行時間?
依賴安裝問題:中國大陸PyPI存取受限。
最終,我們成功實現了完全在瀏覽器中運行的 MarkItDown 工具。歡迎在 Office File to Markdown 中試試看。
這是在 Worker 中執行 Python 的核心程式碼:
// eslint-disable-next-line no-undef importScripts('https://testingcf.jsdelivr.net/pyodide/v0.26.4/full/pyodide.js') async function loadPyodideAndPackages() { // eslint-disable-next-line no-undef const pyodide = await loadPyodide() globalThis.pyodide = pyodide await pyodide.loadPackage('micropip') const micropip = pyodide.pyimport('micropip') // micropip.set_index_urls([ // 'https://pypi.your.domains/pypi/simple', // ]) await micropip.install('markitdown==0.0.1a2') } const pyodideReadyPromise = loadPyodideAndPackages() globalThis.onmessage = async (event) => { await pyodideReadyPromise const file = event.data try { console.log('file', file) const startTime = Date.now() globalThis.pyodide.FS.writeFile(`/${file.filename}`, file.buffer) await globalThis.pyodide.runPythonAsync(` from markitdown import MarkItDown markitdown = MarkItDown() result = markitdown.convert("/${file.filename}") print(result.text_content) with open("/${file.filename}.md", "w") as file: file.write(result.text_content) `) globalThis.postMessage({ filename: `${file.filename}.md`, content: globalThis.pyodide.FS.readFile(`/${file.filename}.md`, { encoding: 'utf8' }), time: Date.now() - startTime, }) } catch (error) { globalThis.postMessage({ error: error.message || 'convert error', filename: file.filename }) } }
以上是在瀏覽器中輕鬆執行Python程式。的詳細內容。更多資訊請關注PHP中文網其他相關文章!