[Venv nicht erforderlich] Die stärkste Python-Entwicklungsumgebung, die mit Remote Containern erstellt wurde [VS Code / Docker]

Einführung

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

Installation

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

Einstellungen für Remote-Container

Erstellen Sie zunächst ein entsprechendes Entwicklungsverzeichnis und öffnen Sie es mit VS Code.

$ mkdir python-test
スクリーンショット 2019-12-21 16.27.14.png

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. スクリーンショット 2019-12-21 15.09.13.png

Wenn Sie es erfolgreich installiert haben, sehen Sie unten links im VS-Code eine grüne Schaltfläche. スクリーンショット 2019-12-21 14.40.56.png

Wenn Sie es öffnen, sehen Sie ein Menü wie das folgende: スクリーンショット 2019-12-21 14.41.42.png

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. スクリーンショット 2019-12-21 14.45.37.png

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. スクリーンショット 2019-12-21 14.58.01.png

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.

Einstellungen in den Anforderungen.txt

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.

Formatierer / Linter einstellen

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.

Statische Typanalyse

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, ... スクリーンショット 2019-12-21 16.13.41.png Da result2 ein int-Typ ist, kann der str-Typ nicht zugewiesen werden! スクリーンショット 2019-12-21 16.14.01.png Die Operatoren str und int + sind undefiniert! !! スクリーンショット 2019-12-21 16.14.10.png Das Ergebnis ist als int-Typ definiert, aber ich versuche, ihm den str-Typ zuzuweisen! !! !! Ich werde auch die Definition der Hallo-Funktion posten! !! !! スクリーンショット 2019-12-21 16.14.22.png 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.

Am Ende

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.

Recommended Posts

[Venv nicht erforderlich] Die stärkste Python-Entwicklungsumgebung, die mit Remote Containern erstellt wurde [VS Code / Docker]
Holen Sie sich die stärkste Umgebung mit VS Code, Remote-Containern und Remote-Docker-Daemon
Konstruktionsvorlage für die lokale Python-Entwicklungsumgebung [Flask / Django / Jupyter mit Docker + VS-Code]
Debuggen Sie die mit Docker-Compose mit VS-Code erstellte Django-Umgebung aus der Ferne
[Django] Verwenden Sie VS Code + Remote-Container, um schnell eine Entwicklungsumgebung für Django-Container (Docker) zu erstellen.
Erstellen Sie eine Go-Entwicklungsumgebung mit den Remote-Containern von VS Code
Die stärkste Python-Entwicklungsumgebung PyCharms Empfehlung
Die stärkste in Python integrierte Entwicklungsumgebung PyCharm
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Erstellen Sie eine Entwicklungsumgebung mit Jupyter und Flask mit Python in Docker (unterstützt sowohl VS Code als auch Code-Server).
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Erstellen Sie eine Python-Entwicklungsumgebung mit Visual Studio Code
Virtuelle Python / Windows (Windows 10) -Umgebung / Paket mit VSCode
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Verwenden Sie Python in einer Anaconda-Umgebung mit VS-Code
Verwenden Sie den Docker-Entwicklungscontainer bequem mit VS Code
Erstellen Sie eine Python-Ausführungsumgebung mit VS-Code
Cross-Compilieren von Raspberry Pi und Erstellen einer Remote-Debug-Entwicklungsumgebung mit VS Code
Einfache Erstellung einer Python-Datenanalyseumgebung mit Windows 10 Pro x VS Code x Docker
Python-Entwicklungsumgebung mit Windows + Anaconda3 + Visual Studio Code
Python-Entwicklungsumgebung mit Windows + Python + PipEnv + Visual Studio-Code
Python mit VSCode (Windows 10)
Vereinheitlichen Sie die Umgebung des Python-Entwicklungsteams, beginnend mit Poetry
Richten Sie eine Python-Entwicklungsumgebung mit Visual Studio Code ein
Erstellen Sie eine VS Code + Docker-Entwicklungsumgebung mit Linux VM
Debuggen Sie Python mit VS-Code
Bereiten Sie die Python-Entwicklungsumgebung mit Mac + Windows + VisualStudio Code (Windows-Version) vor.
Bereiten Sie die Python3-Umgebung mit Docker vor
Bereiten Sie die Python-Entwicklungsumgebung mit Mac + Windows + VisualStudio Code (Mac-Version) vor.
Erstellen Sie mit VSCode & Docker Desktop eine einfache Python-Entwicklungsumgebung
Die Geschichte, dass Python nicht mehr mit VS Code (Windows 10) arbeitet
So gelangen Sie mit Vagrant in die Python-Entwicklungsumgebung
UpNext2 Development Record # 1 Erstellen Sie eine Python CI-Umgebung in VS Code
Erstellen Sie eine Python-Umgebung mit WSL + Pyenv + Jupyter + VSCode
So entwickeln Sie Container auf Remote-Servern mit VS Code Remote-Containern
So erstellen Sie eine Python- und Jupyter-Ausführungsumgebung mit VSCode
Erstellen Sie eine MySQL + Python-Umgebung mit Docker
Überprüfen der NAOqi Python-Entwicklungsumgebung
Richten Sie mit Atom eine Python-Entwicklungsumgebung ein
Erstellen Sie die Entwicklungsumgebung von Django mit Docker neu! !! !! !!
Anwendungsentwicklung mit Docker + Python + Flask
Installieren Sie Python mit Mac vs Code
Bereiten Sie die Entwicklungsumgebung mit anyenv vor
Debuggen eines Python-Programms durch Remoteverbindung mit einem Docker-Container in einer WSL2-Umgebung mit VS-Code
Erstellen Sie eine Python-Entwicklungsumgebung unter Windows (Remote-WSL für Visual Studio Code).
Vorgehensweise zum Erstellen einer virtuellen Python-Umgebung mit VS-Code unter Windows
Ich habe Umgebungsvariablen in Docker festgelegt und in Python angezeigt.
Greifen Sie mit Requests auf die Docker Remote API zu
Python-Entwicklungsumgebung für macOS mit venv 2016
Erstellen Sie mit Docker eine Jupyter Lab (Python) -Umgebung
[Entwicklungsumgebung] Python mit Xcode [Mit Bildschirmübergang]
Verwenden von venv in der Windows + Docker-Umgebung [Python]
Hinter dem Flyer: Docker mit Python verwenden
Erstellen Sie mit Docker eine Python + uWSGI + Nginx-Umgebung
Aufbau der Python3 + venv + VSCode + macOS-Entwicklungsumgebung