首頁 > 後端開發 > Python教學 > 在瀏覽器中輕鬆執行Python程式。

在瀏覽器中輕鬆執行Python程式。

DDD
發布: 2024-12-29 00:05:09
原創
965 人瀏覽過

微軟最近開源了 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 確實是瀏覽器的未來。

面臨的主要挑戰與解決方案:

  1. 檔案傳輸問題:如何將使用者選擇的檔案傳遞到 Worker 中的 Python 執行時間?

  2. 依賴安裝問題:中國大陸PyPI存取受限。

最終,我們成功實現了完全在瀏覽器中運行的 MarkItDown 工具。歡迎在 Office File to Markdown 中試試看。

Run Python programs easily in the browser.

這是在 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 })
  }
}

登入後複製

Run Python programs easily in the browser.

以上是在瀏覽器中輕鬆執行Python程式。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板