Maison >développement back-end >Tutoriel Python >Exécutez facilement des programmes Python dans le navigateur.

Exécutez facilement des programmes Python dans le navigateur.

DDD
DDDoriginal
2024-12-29 00:05:091005parcourir

Microsoft a récemment open-source MarkItDown, un programme qui convertit les fichiers Office au format Markdown. Le projet a rapidement grimpé sur la liste des tendances de GitHub dès sa sortie.

Cependant, étant donné que MarkItDown est un programme Python, son utilisation peut être difficile pour les utilisateurs non techniques. Pour résoudre ce problème, j'ai pensé à utiliser la technologie WebAssembly pour exécuter du code Python directement dans le navigateur.

Pyodide est un programme open source qui exécute Python dans le navigateur, en utilisant WebAssembly pour porter CPython, il prend donc en charge toute la syntaxe Python. Les Python Workers de Cloudflare utilisent également Pyodide.

Pyodide est un portage de CPython vers WebAssembly/Emscripten.

Pyodide permet d'installer et d'exécuter des packages Python dans le navigateur à l'aide de micropip. Tout package Python pur avec des roues disponibles sur PyPI est pris en charge.

De nombreux packages avec des extensions C ont également été portés pour être utilisés avec Pyodide. Ceux-ci incluent des packages courants tels que regex, PyYAML, lxml et des packages Python scientifiques, notamment NumPy, pandas, SciPy, Matplotlib et scikit-learn. Pyodide est livré avec une interface de fonctions étrangères JavaScript ⟺ Python robuste qui vous permet de mélanger librement ces langages dans votre code avec un minimum de friction. Cela inclut une prise en charge complète de la gestion des erreurs, de l'async/wait, et bien plus encore.

Lorsqu'il est utilisé dans le navigateur, Python a un accès complet aux API Web.

Essayer d'exécuter MarkItDown s'est déroulé d'une manière étonnamment fluide, prouvant que WebAssembly est véritablement l'avenir des navigateurs.

Les principaux défis rencontrés et solutions :

  1. Problème de transfert de fichiers : Comment transmettre les fichiers sélectionnés par l'utilisateur au runtime Python dans Worker ?

  2. Problème d'installation des dépendances : accès limité à PyPI en Chine continentale.

Finalement, nous avons implémenté avec succès un outil MarkItDown qui s'exécute entièrement dans le navigateur. N'hésitez pas à l'essayer sur Office File to Markdown.

Run Python programs easily in the browser.

Voici le code de base pour exécuter Python dans Worker :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn