Ich wollte den Python-Code von jupyter notebook auf einem anderen Computer ausführen, daher habe ich beschlossen, ihn mithilfe der jupyter-API zu extrahieren und zu speichern.
Da ein Token erforderlich ist, um den Jupyter von außen zu bedienen, überprüfen Sie zuerst den Token.
Ich habe es eingegeben, als ich jupyter zum ersten Mal gestartet habe (sollte ich?), Aber ich glaube, ich habe es normalerweise vergessen. Überprüfen Sie daher den jupyter-Container in der Reihenfolge Suche → Protokollanzeige → Token-Bestätigung.
Finden Sie einen Jupyter-Container Im folgenden Beispiel lautet die ID "022298a2039a" und der Containername "jupyter".
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
022298a2039a jupyter/scipy-notebook:latest "tini -g -- start-no…" 11 days ago Up 2 days 0.0.0.0:8888->8888/tcp jupyter
Protokoll anzeigen Zeigen Sie das Protokoll an, indem Sie die ID oder den Containernamen angeben.
#Für Container-ID
$ docker logs 022298a2039a
#Für Containernamen
$ docker logs jupyter
# docker-Zum komponieren
$ docker-compose logs
Token-Bestätigung Wahrscheinlich befindet sich am Ende des Protokolls ein Token. Da Fehlerprotokolle wie API ausgegeben werden, fließen die Protokolle, wenn Sie mehrere Versuche und Fehler durchführen.
jupyter | Or copy and paste one of these URLs:
jupyter | http://022298a2039a:8888/?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
jupyter | or http://127.0.0.1:8888/?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Ich habe ein Notizbuch zum Testen erstellt. Die URL ist unten.
http://localhost:8888/notebooks/work/test1.ipynb
Da die API-Operation mit Python ausgeführt wird, ist das Anforderungspaket erforderlich. Es muss nicht Docker sein, da es nur Anfragen stellt, aber ich denke, es wird einfacher sein, es später zu einem Dienst zu machen, also werde ich es in einen Container legen. Details zur Testumgebung (Dockerfile) unten.
FROM python:3.6-buster
RUN pip install requests
Bauen.
$ docker build -t jupyter-api .
Starten Sie den Container. Sie müssen nicht mounten (-v), sondern mounten vorerst den aktuellen, um die erstellte Datei abzurufen.
$ docker run -it --net host -v $(pwd):/tmp jupyter-api bash
Überprüfen Sie zunächst, ob die Jupyter-API verwendet werden kann.
import requests
url_api = 'http://localhost:8888/api'
response = requests.get(url_api)
print(response.status_code, response.text) # 200 {"version": "6.0.3"}
Ich kann die API sicher treffen, also bekomme ich ein Notizbuch.
notebook_path = '/work/test1.ipynb'
url_file = url_api + '/contents' + notebook_path
token = 'xxxxxxxxxxxxxxxxx' #Token setzen
headers = {'Authorization': 'token ' + token}
response = requests.get(url_file, headers=headers)
Notebook-Informationen werden im json-Format in response.text zurückgegeben. Unten wird das Ausführungsergebnis von print (response.text) zur Anzeige formatiert.
{
"name": "test1.ipynb",
"path": "work/test1.ipynb",
"last_modified": "2020-03-07T21:08:58.897321Z",
"created": "2020-03-07T21:08:57.594298Z",
"content": {
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"trusted": true
},
"outputs": [
{
"data": {
"text/plain": "array([0.83709745, 0.46685874, 0.94285637, 0.03938868, 0.79617107,\n 0.98784776, 0.27798577, 0.96118447, 0.5253161 , 0.0690074 ])"
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": "import numpy as np\nnp.random.random(10)"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
},
"format": "json",
"mimetype": null,
"size": 921,
"writable": true,
"type": "notebook"
}
Dieses Mal möchte ich den Codeteil des Notizbuchs extrahieren, damit ich die "Quelle" des Blocks "content.cells.cell_type =" code "" extrahieren kann. cell_type ist cell_type = 'markdown' für markdown-Blöcke.
import json
json_src = json.loads(response.text)
src = [cell['source'] for cell in json_src['content']['cells'] if cell['cell_type'] == 'code']
Der Code jeder Zelle wird in src als Array-Element gespeichert, und da diesmal nur eine Zelle des Quellcodes vorhanden ist, handelt es sich um ein Array aus einem Element.
['import numpy as np\nnp.random.random(10)']
Ausgabe in eine Datei. Geben Sie es vorerst mit einer UTF8-Deklaration aus.
with open('/tmp/test1.py', 'w') as f:
print("# -*- coding: utf-8 -*-", file=f)
for block in src:
print(block, file=f)
Überprüfen Sie die Ausgabedatei. Perfekt.
# -*- coding: utf-8 -*-
import numpy as np
np.random.random(10)
Da ich es sicher vom Notebook ausgeben konnte, kann ich es anscheinend kochen, backen oder ausführen.
Recommended Posts