Comment créer une fonction en code Python qui prend en sortie une sortie riche IPython (format HTML) ?
P粉713846879
P粉713846879 2023-08-31 21:59:28
0
1
685
<p>Comment construire une fonction appelée <code>foo()</code> <pre class="brush:php;toolbar:false;">pycode = ''' depuis matplotlib importer pyplot en tant que plt plt.plot([1, 2, 3]) plt.show() ''' out = foo(pycode)</pre> <p>Où<code>out</code> est la sortie HTML en texte enrichi qu'ipython ou le notebook jupyter produira</p> <p>Existe-t-il une fonction intégrée dans ipython qui peut réaliser cela ? Je suppose qu'il devrait y en avoir, mais je ne le trouve pas sur Google. </p> <p>EDIT : je souhaite que cette fonction existe dans mon script Python, pas lors de l'exécution du shell ipython. </p> <p> EDIT : Ce que je veux faire, c'est essentiellement recréer quelque chose de similaire à une cellule de notebook jupyter, je lui donne le code et il renvoie la sortie riche (probablement en HTML) de manière visuelle, tout comme la cellule de notebook jupyter Idem format. </p>
P粉713846879
P粉713846879

répondre à tous(1)
P粉486138196

Je suppose que vous recherchez la méthode exec()en Python ?

Dans JupyterLab avec matplotlib installé, vous pouvez exécuter le code suivant dans une cellule et voir le résultat en dessous :

pycode = '''
from matplotlib import pyplot as plt
plt.plot([1, 2, 3])
plt.show()
'''
out = exec(pycode)

N'oubliez pas que l'utilisation de exec()和相关的eval() et du eval() associé n'est généralement pas recommandée. Leur utilisation peut causer de sérieux problèmes en permettant à d'autres personnes, voire à vous-même, d'exécuter par inadvertance du code que vous ne souhaitez pas exécuter. Si vous utilisez la bonne méthode, vous n'avez généralement pas besoin de les utiliser, vous pouvez vous y référer ici. (Il semble désormais même possible d'exécuter en utilisant Python basé sur WebAssembly, voir PyScript : est-il possible d'exécuter un script Python téléchargé ?.)


Mise à jour en fonction de la réponse au premier commentaire :

Écrit de cette façon, bien que le code soit capable de dessiner le graphique, out并没有收集任何内容,因为exec(pycode)恰好在最后一行。可以通过使用IPython的捕获工具来收集RichOutput。而且,由于它是通过导入实现的,如果你在Python中也安装了Jupyter生态系统,它应该也能够工作。换句话说,尽管我在notebook中演示它,你可以编写一个函数来使用return captured.outputs[0], il renverra le RichOutput du dessin.

Dans ce cahier les principes sous-jacents sont expliqués en détail.

Veuillez noter que puisque je m'occupe de RichOutput et que je génère des images, vous devrez également consulter les références qu'il contient. Il y a bien d’autres choses que je n’ai pas abordées.


Créez une fonction simple sans utiliser exec()

Dans cet exemple de carnet, vous pouvez voir comment en créer un .py文件。通常情况下,你可以通过手动保存文本来在文本编辑器中创建这样的文件,例如将以下内容保存为plot_func.py par programmation :

def my_plot_func():
    from matplotlib import pyplot as plt
    plt.plot([1, 2, 3])
    plt.savefig('my_plot_via_func.png')

Ensuite, importez-le et exécutez-le. Au cours de ce processus, un fichier image est également enregistré. Dans le cahier, le fichier image my_plot_via_func.png sera affiché.

Ceci n'est qu'une version simple. Le processus d'importation et d'exécution de fonctions fonctionne également dans le terminal ou ailleurs en Python pur, jusqu'à ce que le fichier image soit affiché. Si vous renvoyez les résultats du tracé sous forme d'objets graphiques (graphiques), vous avez besoin d'un moyen de les afficher. Cela fonctionne en Jupyter, mais pas en Python pur.

J'ai ajouté cette partie car je ne sais toujours pas ce que vous voulez faire. J'ai également une version plus avancée qui utilise des dataframes Pandas spécialement organisées pour générer des tracés spécialisés. Pour l'essayer, cliquez ici, puis cliquez sur lancer le classeur et suivez l'exemple de carnet qui apparaît en début de session. Peut-être que cela vous aidera à mieux exprimer vos besoins. D'autant plus que cela ressemblera à toutes les choses difficiles de cette intrigue script Coding launch binder,并按照会话开始时出现的示例notebook进行操作。也许这能帮助你更好地表达你的需求。特别是因为它将类似于这个绘图脚本中的所有硬编码的东西泛化,使其成为一个可以调用的命令行脚本或函数。你将看到我在下面的评论中所说的必要基础设施。命令行脚本也可以在纯Python中运行。你会看到我在notebook中通常使用%run,因为它更全面;然而,在notebook中,如果你可以牺牲更好的输出处理并且不需要在notebook命名空间中运行脚本,那么你通常可以将!python替换为%run,就像%run -i généralise quelque chose dans un script ou une fonction de ligne de commande qui peut être appelée. Vous verrez l’infrastructure nécessaire dont je parle dans mes commentaires ci-dessous. Les scripts de ligne de commande peuvent également être exécutés en Python pur. Vous verrez que j'utilise généralement %run dans les notebooks car il est plus complet. Cependant, dans les notebooks, si vous pouvez sacrifier une meilleure gestion de la sortie et n'avez pas besoin d'exécuter le script dans l'espace de noms du notebook, alors vous pouvez généralement remplacer !python par %run, comme le permet %run -i.

Un exemple d'utilisation du tracé matplotlib pour générer du code qui renvoie un tracé spécifique peut être trouvé ici.


Générer du HTML

La question d'origine concernait le HTML, j'ai ajouté une section pour générer du HTML en bas de cet exemple de cahier principal, en réponse au premier commentaire. En fait, Cet article "Intégrer des graphiques matplotlib dans iPython HTML" aurait pu couvrir la majeure partie de la question d'origine ?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal