Python fällt auf, da es in der Top-1-Sprache [^ 1] glänzt und zum Testobjekt für die IPA Basic Information Engineer-Prüfung [^ 2] wird.
Aber warte eine Minute! Entwickeln Sie sich richtig und profitieren Sie vom Python-Ökosystem?
Durch die Schaffung einer guten Entwicklungsumgebung können Sie die Entwicklung nicht nur durch ** Eingabeinterpolation und Formatierung effizienter gestalten, sondern auch ** unerwartete Probleme durch statische Analyse verhindern **, ① Einfach ② Explosionsgeschwindigkeit ③ Sie können das Programm sicher schreiben.
Natürlich gibt es viele Anleitungen zum Erstellen einer so komfortablen Umgebung, aber das Problem ist, dass es schwierig ist, eine Oreore Python-Entwicklungsumgebung für verschiedene PCs freizugeben, selbst wenn Sie sie erstellen können.
weil
Dies liegt daran, dass es ein Problem gibt, das von der Entwicklungsumgebung abhängt. ** Ich möchte, dass Sie sicher sein können, dass der gleiche Vorgang zwischen verschiedenen PCs ausgeführt wird, egal ob einzelne oder mehrere Personen **. Darüber hinaus gibt es die Aufforderung, ** das Projekt nur mit einem Texteditor zu öffnen und die Entwicklungsumgebung ohne Erlaubnis zu erstellen **.
In diesem Artikel lösen wir dieses Problem mithilfe des Remote-Containers von VSCode. Mit den in diesem Artikel beschriebenen Methoden können Sie:
Machen wir das
In diesem Artikel werden die folgenden Tools verwendet. Bitte installieren Sie unter Bezugnahme auf andere Artikel.
Wenn Sie den folgenden Befehl vom Terminal aus eingeben können, können Sie loslegen.
$ docker --version
Docker version 19.03.5, build 633a0ea
Erstellen Sie zunächst ein entsprechendes Entwicklungsverzeichnis und öffnen Sie es mit VS Code.
$ mkdir python-test
Erstellen Sie die folgende Verzeichnisstruktur
.
└── python-test
├── .devcontainer
│ ├── Dockerfile
│ └── devcontainer.json
├── .vscode
│ └── extensions.json
└── src
└── main.py
Bitte kopieren Sie die folgenden Inhalte und fügen Sie sie in jede Datei ein.
.devcontainer/Dockerfile
FROM python:3.7.3-slim
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
apt-utils \
gcc \
build-essential \
&& pip install --no-cache-dir \
autopep8 \
flake8 \
&& apt-get autoremove -y \
&& apt-get clean -y \
&& rm -rf /var/lib/apt/lists/*
Hier können Sie Ihre bevorzugte Python-Version angeben, indem Sie die Nummer im Teil von FROM python: 3.7.3-slim
ändern.
json:.devcontainer/devcontainer.json
{
"name": "Python Project",
"dockerFile": "Dockerfile",
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",
"python.pythonPath": "/usr/local/bin/python"
},
"extensions": [
"ms-python.python"
]
}
Hier können Sie den Teil von "name": "Python Project" in eine beliebige Zeichenfolge ändern.
In settings
können Sie dasselbe schreiben, was Sie in .vscode / settins.json
schreiben. Ursprünglich sind der Bash-Pfad und der Python-Pfad von der Umgebung abhängig, daher müssen sie für jede Person festgelegt werden. Diesmal wird sie jedoch im Container ausgeführt, damit die Pfadinformationen bekannt sind und festgelegt werden können. Ist der Punkt.
Sie können VSCode-Erweiterungen auch zu "Erweiterungen" hinzufügen. Die hier beschriebenen Erweiterungen werden automatisch installiert. Nur Remote-Container können die Installation von VSCode-Erweiterungen erzwingen. Schreiben Sie daher die Erweiterungen, die alle installieren sollen, hier. Dieses Mal fügen wir eine Python-Erweiterung für VS-Code hinzu.
src/main.py
import sys
print(sys.version_info)
Nehmen wir an, dass das Python-Skript die Version ausgibt.
json:.vscode/extensions.json
{
"recommendations": [
"ms-vscode-remote.remote-containers"
]
}
Geben Sie Remote-Container für Empfehlungen für VS-Code-Erweiterungen an.
Es ist wichtig zu beachten, dass im Gegensatz zu Erweiterungen in devcontainer.json
das Schreiben diese nicht tatsächlich installiert. Wenn Sie mit dem Kopieren der Dateien fertig sind, öffnen Sie VSCode erneut für die eigentliche Installation.
Dann erscheint das folgende Popup in der unteren rechten Ecke. Wählen Sie Alle installieren, um den Remote-Container zu installieren.
Wenn Sie es erfolgreich installiert haben, sehen Sie unten links im VS-Code eine grüne Schaltfläche.
Wenn Sie es öffnen, sehen Sie ein Menü wie das folgende:
Wählen Sie "Remote-Container: Ordner im Container öffnen ...". Wenn der Ordnerauswahlbildschirm angezeigt wird, wählen Sie das Projektverzeichnis aus (in diesem Fall Python-Test).
Anschließend wird der in .devcontainer / Dockerfile
beschriebene Build des Containers automatisch ausgeführt. Sie können den Fortschritt sehen, indem Sie Details öffnen. Wenn Sie im Build stecken bleiben, schauen Sie sich die Details an.
Wenn der Build normal abgeschlossen ist, wird der Container gestartet und verbunden. Öffnen Sie nach dem Anschließen an den Container das interne Terminal von VS Code.
Oh? Irgendwie ist der Shell-Benutzer root und das Verzeichnis ist auch "/ workspaces". Dies zeigt an, dass Sie es in einem Container-Terminal ablegen, das vom Host-Betriebssystem unabhängig ist, nicht im Terminal des Host-Betriebssystems (Win / Mac usw.).
Ich kenne Docker nicht! Sie könnten das sagen, aber lassen Sie uns vorerst Python ausführen.
/workspaces/python-test# python src/main.py
sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)
Sie haben die in FROM python: 3.7.3-slim
angegebene Python-Version!
Damit sind die Grundeinstellungen abgeschlossen.
Selbst wenn Sie auf einem anderen PC "git clone", können Sie von nun an dieselbe Umgebung reproduzieren, indem Sie den Container mit "Remote-Container: Ordner in Container öffnen ..." eingeben.
Dies befindet sich in einem Container, so dass Sie jede "Pip-Installation" darin durchführen können. Die hier installierten Module haben keine Auswirkungen auf das Host-Betriebssystem, sodass die Entwicklung destruktiv fortgesetzt werden kann.
/workspaces/python-test# pip install numpy
/workspaces/python-test# python
>>> import numpy as np
>>> np.__version__
'1.17.4'
Wenn Sie den Container erneut erstellen und neu erstellen, verschwindet das installierte Modul. Lassen Sie uns dieses Pip-Modul reparieren, während wir mit der Entwicklung fortfahren! Wenn ja, erstellen wir die in Python übliche "require.txt" und schreiben ein Modul in die "pip install".
Die Verzeichnisstruktur und das Schreiben von "require.txt" sind wie folgt.
.
└── python-test
├── .devcontainer
│ ├── Dockerfile
│ └── devcontainer.json
├── .vscode
│ └── extensions.json
└── requirements.txt
requirements.txt
numpy==1.17.4
Sie können eine feste Version für "pip install" in die Datei "resources.txt" schreiben. Es ist wünschenswert, die Version zu korrigieren, um die Reproduzierbarkeit sicherzustellen.
Und machen wir devcontainer.json
wie folgt.
json:.devcontainer/devcontainer.json
{
"name": "Python Project",
"dockerFile": "Dockerfile",
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",
"python.pythonPath": "/usr/local/bin/python"
},
"extensions": [
"ms-python.python"
],
"postCreateCommand": "pip install -r requirements.txt"
}
Sie haben postCreateCommand
hinzugefügt. Dies ist der Befehl, der ausgeführt wird, nachdem der Container erstellt wurde. Von nun an werden immer die in require.txt
beschriebenen Module installiert.
Drücken Sie nach dem Aktualisieren der Datei die grüne Taste unten links und wählen Sie "Remote-Container: Container neu erstellen", um die Aktualisierung im Container wiederzugeben.
Als nächstes stellen Sie Formatierer / Linter ein.
Die devcontainer.json
beim Hinzufügen des Python-Formatierers / Linter lautet wie folgt.
json:.devcontainer/devcontainer.json
{
"name": "Python Project",
"dockerFile": "Dockerfile",
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",
"python.pythonPath": "/usr/local/bin/python",
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--ignore=E402,E501"
],
"python.formatting.provider": "autopep8",
"python.formatting.autopep8Args": [
"--ignore",
"E402,E501",
"--max-line-length",
"150"
],
"[python]": {
"editor.formatOnSave": true
}
},
"extensions": [
"ms-python.python"
],
"postCreateCommand": "pip install -r requirements.txt",
}
Flake8 wird als Linter und Autopep8 als Formatierer angegeben, und E402 (Import auf Modulebene nicht oben in der Datei) und E501 (Zeile zu lang) werden ignoriert. Das Format wird beim Speichern einer Datei angewendet.
Auch wenn Sie damit einen so durcheinandergebrachten Code schreiben
before.py
a =0
def method1(args) :
print( args)
def method2() :
if a ==0:
method1( "hoge" + "fuga" )
Auf diese Weise wird es beim Speichern formatiert.
after.py
a = 0
def method1(args):
print(args)
def method2():
if a == 0:
method1("hoge" + "fuga")
Normalerweise werden solche Formatierungs- / Linter-Einstellungen in .vscode / settings.json
beschrieben. Da es sich bei ".vscode / settings.json" jedoch um eine persönliche Einstellungsdatei handelt, wird sie in vielen Projekten auf ".gitignore" gesetzt. Außerdem müssen Sie pip install flake8 autopep8
manuell ausführen, sodass das Schreiben der Konfigurationsdatei nicht bedeutet, dass Formatierer / Linter angewendet wird.
Auf der anderen Seite kann es diesmal in die Einstellungsdatei von Remote Containers geschrieben werden, so dass es einfach zu teilen ist. Da es sicher den Status reproduzieren kann, in dem flake8 und autopep8 enthalten sind, wird "unformatierter Quellcode festgeschrieben". Sie können das auch verhindern.
Übrigens, wo lief pip install flake8 autopep8
?
Die Antwort ist in ".devcontainer / Dockerfile".
.devcontainer/Dockerfile
FROM python:3.7.3-slim
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
apt-utils \
gcc \
build-essential \
&& pip install --no-cache-dir \
autopep8 \
flake8 \
&& apt-get autoremove -y \
&& apt-get clean -y \
&& rm -rf /var/lib/apt/lists/*
Wenn Sie "pytest" in einen Container schreiben möchten, können Sie ihn hinzufügen.
.devcontainer/Dockerfile
RUN pip install --no-cache-dir \
autopep8 \
flake8 \
pytest
Außerdem sind autopep8 und flake8 zur Entwicklungszeit und nicht zur Laufzeit erforderlich. Sie können solche Module in Dockerfile schreiben und die zur Laufzeit erforderlichen Dateien in require.txt
schreiben.
Lassen Sie uns abschließend Typhinweise einführen, die mit Python 3.6 oder höher verwendet werden können [^ 4]. Durch die Einführung von Typhinweisen explodiert die Lebensqualität.
Machen wir devcontainer.json
wie folgt
Hier wird Pyrit als statisches Analysewerkzeug für Typhinweise verwendet.
json:.devcontainer/devcontainer.json
"extensions": [
"ms-python.python",
"ms-pyright.pyright"
],
Nachdem Sie Änderungen vorgenommen haben, drücken Sie die grüne Taste unten links und wählen Sie "Remote-Container: Container neu erstellen".
Schreiben Sie als Nächstes die Copyright-Konfigurationsdatei. Die Verzeichnisstruktur ist wie folgt.
.
└── python-test
├── pyrightconfig.json
└── src
└── main.py
pyrightconfig.json
{
"include": [
"src"
],
"reportTypeshedErrors": false,
"reportMissingImports": true,
"reportMissingTypeStubs": false,
"pythonVersion": "3.7",
"pythonPlatform": "Linux",
"executionEnvironments": [
{
"root": "src"
}
]
}
Ausführliche Informationen zum Schreiben von pyrightconfig.json finden Sie in anderen Artikeln. (Vielleicht schreibe ich etwas anderes)
Jetzt bearbeiten wir src / main.py
.
src/main.py
def hello(name: str, age: int) -> str:
result1: str = "My name is " + name + ".\n"
result2: int = "I am " + str(age) + " years old."
return result1 + result2
result: int = 10
result = hello(name="Otao", age=23)
print(result)
Mit Tipphinweisen in Python können Sie solche Funktionen und Variablen mit Anmerkungen versehen.
Wenn Sie "src / main.py" mit installiertem Copyright öffnen, ...
Da result2 ein int-Typ ist, kann der str-Typ nicht zugewiesen werden!
Die Operatoren str und int +
sind undefiniert! !!
Das Ergebnis ist als int-Typ definiert, aber ich versuche, ihm den str-Typ zuzuweisen! !! !!
Ich werde auch die Definition der Hallo-Funktion posten! !! !!
Es wird der Fehler angezeigt, der sich auf den Typ bezieht.
Wir empfehlen die Verwendung von Typhinweisen aus folgenden Gründen:
Lassen Sie es uns vorstellen.
Seltsamerweise (?) Kann dieses Skript ausgeführt werden, nicht wahr? (Type Hints ist nur eine Anmerkung und wird zur Laufzeit ignoriert.)
/workspaces/python-test# python3 src/main.py
My name is Otao.
I am 23 years old.
Habe ein angenehmes Python-Leben! (Artikel werden entsprechend aktualisiert.)
[^ 1]: Programmiersprache, die Sie lernen möchten, Sprache, die Sie nicht lernen möchten, https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00501/111200004/ [^ 2]: Pressemitteilung: Überprüfen Sie die Fragen in der Prüfung zum Basic Information Engineer unter https://www.ipa.go.jp/about/press/20190124.html [^ 3]: Tatsächlich kann das Verhalten je nach Host-Betriebssystem unterschiedlich sein, und es kann erforderlich sein, die Docker-Datei zu ändern. [^ 4]: Typhinweise für die Funktion waren von 3.5, daher ist sie nicht genau. Da Sie jedoch ab 3.6 Variablen auch Typanmerkungen hinzufügen können, möchte ich, dass Sie 3.6 oder höher verwenden.