[Venv non requis] L'environnement de développement Python le plus puissant créé avec des conteneurs distants [VS Code / Docker]

introduction

Python attire l'attention car il brille dans le premier langage populaire [^ 1] et devient un sujet de test pour l'examen IPA Basic Information Engineer [^ 2].

Mais attendez une minute! Développez-vous correctement en profitant de l'écosystème Python?

En créant un bon environnement de développement, vous pouvez non seulement rendre le développement plus efficace par ** interpolation d'entrée et formateur **, mais également éviter les problèmes inattendus grâce à l'analyse statique **, ① Facile ② Vitesse explosive ③ Vous pouvez écrire le programme en toute sécurité.

Bien sûr, il existe de nombreux articles sur la façon de créer un environnement aussi confortable, mais le problème est que même si vous pouvez créer un environnement de développement Oreore Python, il est difficile de le partager entre différents PC.

Parce que

C'est parce qu'il y a un problème qui dépend de l'environnement de développement. ** Je veux que vous soyez assuré que la même opération sera effectuée entre différents PC, qu'ils soient individuels ou multiples **. De plus, il y a une demande qui ** ouvre simplement le projet avec un éditeur de texte et l'environnement de développement doit être construit sans autorisation **.

Donc, dans cet article, nous allons résoudre ce problème en utilisant le conteneur distant de VSCode. En utilisant les méthodes décrites dans cet article, vous pouvez:

Faisons le

Installation

Dans cet article, nous utiliserons les outils suivants. Veuillez l'installer en vous référant à d'autres articles.

Si vous pouvez taper la commande suivante à partir du terminal, vous êtes prêt à commencer.

$ docker --version
Docker version 19.03.5, build 633a0ea

Paramètres des conteneurs distants

Tout d'abord, créez un répertoire de développement approprié et ouvrez-le avec VS Code.

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

Créez la structure de répertoires suivante

.
└── python-test
    ├── .devcontainer
    │   ├── Dockerfile
    │   └── devcontainer.json
    ├── .vscode
    │   └── extensions.json
    └── src
        └── main.py

Veuillez copier et coller le contenu suivant dans chaque fichier.

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

Ici, vous pouvez spécifier votre version Python préférée en changeant le nombre dans la partie FROM python: 3.7.3-slim.

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"
    ]
}

Ici, vous pouvez remplacer la partie " name ":" Python Project " par la chaîne de votre choix.

Dans settings, vous pouvez écrire la même chose que vous écrivez dans .vscode / settins.json. À l'origine, le chemin bash et le chemin python dépendent de l'environnement, il est donc nécessaire de les définir pour chaque individu, mais cette fois, il est exécuté dans le conteneur, de sorte que les informations de chemin sont connues et peuvent être corrigées. C'est le point.

Vous pouvez également ajouter des extensions VSCode aux «extensions», et les extensions décrites ici seront installées automatiquement. Seuls les conteneurs distants peuvent forcer l'installation des extensions VSCode, alors écrivez ici les extensions que vous souhaitez que tout le monde installe. Cette fois, nous ajoutons une extension Python pour VS Code.

src/main.py


import sys
print(sys.version_info)

Supposons que le script Python génère la version.

json:.vscode/extensions.json


{
    "recommendations": [
        "ms-vscode-remote.remote-containers"
    ]
}

Spécifiez les conteneurs distants pour les recommandations pour les extensions VS Code. Il faut noter que contrairement aux extensions de devcontainer.json, l'écrire ne l'installe pas réellement. Ainsi, lorsque vous avez terminé de copier les fichiers, rouvrez VSCode pour l'installation réelle. Ensuite, la fenêtre contextuelle suivante apparaîtra dans le coin inférieur droit. Sélectionnez Tout installer pour installer le conteneur distant. スクリーンショット 2019-12-21 15.09.13.png

Si vous l'avez installé avec succès, vous verrez un bouton vert en bas à gauche de VS Code. スクリーンショット 2019-12-21 14.40.56.png

Lorsque vous l'ouvrez, vous verrez un menu comme celui-ci, スクリーンショット 2019-12-21 14.41.42.png

Sélectionnez "Remote-Containers: Open Folder in Container ...". Lorsque l'écran de sélection de dossier apparaît, sélectionnez le répertoire du projet (test python dans ce cas).

Ensuite, la construction du conteneur décrit dans .devcontainer / Dockerfile s'exécutera automatiquement. Vous pouvez voir la progression en ouvrant les détails. Si vous êtes coincé dans la construction, jetez un œil aux détails. スクリーンショット 2019-12-21 14.45.37.png

Lorsque la construction est terminée normalement, le conteneur sera démarré et connecté. Une fois connecté au conteneur, ouvrez le terminal interne de VS Code. スクリーンショット 2019-12-21 14.58.01.png

Oh? D'une manière ou d'une autre, l'utilisateur du shell est root et le répertoire est également / workspaces. Cela indique que vous le placez dans un terminal conteneur indépendant de l'OS hôte, et non dans le terminal de l'OS hôte (Win / Mac, etc.).

Je ne connais pas Docker! Vous pourriez dire cela, mais exécutons Python pour le moment.

/workspaces/python-test# python src/main.py 
sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)

Vous avez la version de python spécifiée dans FROM python: 3.7.3-slim! Ceci termine les réglages de base.

Désormais, même si vous git clone sur un autre PC, vous pouvez reproduire le même environnement en entrant dans le conteneur avec" Remote-Containers: Open Folder in Container ... ".

Paramètres dans requirements.txt

Ceci est à l'intérieur d'un conteneur, vous pouvez donc faire n'importe quel pip install à l'intérieur. Les modules installés ici n'ont aucun effet sur le système d'exploitation hôte, le développement peut donc se poursuivre de manière destructive.

/workspaces/python-test# pip install numpy
/workspaces/python-test# python
>>> import numpy as np
>>> np.__version__
'1.17.4'

De plus, si vous créez à nouveau le conteneur et le recréez, le module installé disparaîtra. Alors, corrigeons ce module pip pendant que nous procédons au développement! Si c'est le cas, créons requirements.txt, qui est habituel en Python, et écrivons un module pour pip install dedans.

La structure des répertoires et la façon d'écrire requirements.txt sont les suivantes.

.
└── python-test
    ├── .devcontainer
    │   ├── Dockerfile
    │   └── devcontainer.json
    ├── .vscode
    │   └── extensions.json
    └── requirements.txt

requirements.txt


numpy==1.17.4

Dans requirements.txt, vous pouvez écrire une version fixe pour pip install. Il est souhaitable de corriger la version pour assurer la reproductibilité.

Et faisons devcontainer.json comme suit.

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"
}

Vous avez ajouté postCreateCommand. Il s'agit de la commande à exécuter après la création du conteneur. Désormais, les modules décrits dans requirements.txt seront toujours installés.

Après avoir mis à jour le fichier, appuyez sur le bouton vert en bas à gauche et sélectionnez "Remote-Containers: Rebuild Container" pour refléter la mise à jour dans le conteneur.

Définir le formateur / linter

Ensuite, définissez le formateur / linter. Le devcontainer.json lorsque le formateur / linter python est ajouté est le suivant.

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 est spécifié comme linter et autopep8 est spécifié comme formateur, et E402 (importation au niveau du module pas en haut du fichier) et E501 (ligne trop longue) sont ignorés, respectivement. Le format est appliqué lors de l'enregistrement d'un fichier.

Même si vous écrivez un tel code foiré avec

before.py


a    =0
def method1(args)  :
    print(   args)
def method2() :
    if a    ==0:
            method1(   "hoge"   +    "fuga"   )

De cette façon, il sera formaté lorsque vous l'enregistrez.

after.py


a = 0


def method1(args):
    print(args)


def method2():
    if a == 0:
        method1("hoge" + "fuga")

Normalement, ces paramètres de formateur / linter sont décrits dans .vscode / settings.json. Cependant, comme .vscode / settings.json est un fichier de paramètres personnels, de nombreux projets le définissent sur .gitignore. De plus, vous devez exécuter manuellement pip install flake8 autopep8, donc l'écriture du fichier de configuration ne signifie pas que le formateur / linter est appliqué.

D'autre part, cette fois, il peut être écrit dans le fichier de configuration de Remote Containers, il est donc facile à partager, et comme il peut sûrement reproduire l'état où flake8 et autopep8 sont inclus, "Le code source non formaté est validé" Vous pouvez également empêcher cela.

Au fait, où fonctionnait pip install flake8 autopep8? La réponse est dans .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/*

Si vous voulez écrire pytest dans un conteneur, vous pouvez l'ajouter.

.devcontainer/Dockerfile


RUN pip install --no-cache-dir \
    autopep8 \
    flake8 \
    pytest

De plus, autopep8 et flake8 sont requis au moment du développement, pas au moment de l'exécution. Vous pouvez écrire de tels modules dans Dockerfile et écrire les fichiers requis lors de l'exécution dans requirements.txt.

Analyse de type statique

Enfin, introduisons les indices de type qui peuvent être utilisés avec Python 3.6 ou version ultérieure [^ 4]. En introduisant les indices de type, la qualité de vie explosera.

Faisons de devcontainer.json comme suit Ici, la pyrite est utilisée comme outil d'analyse statique pour les indices de type.

json:.devcontainer/devcontainer.json


 "extensions": [
    "ms-python.python",
    "ms-pyright.pyright"
 ],

Après avoir effectué des modifications, appuyez sur le bouton vert en bas à gauche et sélectionnez "Remote-Containers: Rebuild Container".

Ensuite, écrivez le fichier de configuration des droits d'auteur. La structure des répertoires est la suivante.

.
└── 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"
        }
    ]
}

Pour plus de détails sur l'écriture de pyrightconfig.json, reportez-vous à d'autres articles. (Peut-être que j'écris autre chose)

Maintenant éditons 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)

Les conseils de type en python vous permettent de taper des fonctions d'annotation et des variables comme celle-ci. Si vous ouvrez src / main.py avec pyright installé, ... スクリーンショット 2019-12-21 16.13.41.png Puisque result2 est un type int, le type str ne peut pas être assigné! スクリーンショット 2019-12-21 16.14.01.png Les opérateurs str et int + ne sont pas définis! !! スクリーンショット 2019-12-21 16.14.10.png Le résultat est défini comme type int, mais j'essaie de lui attribuer un type str! !! !! Je posterai également la définition de la fonction hello! !! !! スクリーンショット 2019-12-21 16.14.22.png Il affichera l'erreur liée au type.

Nous vous recommandons d'utiliser les indices de type pour les raisons suivantes:

Introduisons-le.

Eh bien, étrangement (?) Ce script peut être exécuté, n'est-ce pas? (Les indices de type ne sont qu'une annotation, ils sont donc ignorés lors de l'exécution.)

/workspaces/python-test# python3 src/main.py 
My name is Otao.
I am 23 years old.

À la fin

Ayez une vie Python confortable! (Les articles seront mis à jour en conséquence.)

[^ 1]: Langage de programmation que vous voulez apprendre, langue que vous ne voulez pas apprendre, https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00501/111200004/ [^ 2]: Communiqué de presse: passez en revue les questions de l'examen d'ingénieur d'information de base, https://www.ipa.go.jp/about/press/20190124.html [^ 3]: En fait, le comportement peut différer selon le système d'exploitation hôte et il peut être nécessaire de modifier le Dockerfile. [^ 4]: Les indices de type pour les fonctions étaient de 3.5, donc ce n'est pas précis, mais comme ce n'est que 3.6 ou plus tard que vous pouvez ajouter des annotations de type aux variables, j'aimerais que vous utilisiez 3.6 ou plus.

Recommended Posts

[Venv non requis] L'environnement de développement Python le plus puissant créé avec des conteneurs distants [VS Code / Docker]
Bénéficiez de l'environnement le plus puissant avec VS Code, Remote-Containers et Remote Docker-Daemon
Modèle de construction d'environnement de développement local Python [Flask / Django / Jupyter avec Docker + VS Code]
Déboguer à distance l'environnement Django créé avec docker-compose avec VS Code
[Django] Créez rapidement un environnement de développement de conteneur Django (Docker) à l'aide de VS Code + Remote Containers
Créez un environnement de développement Go avec les conteneurs distants de VS Code
L'environnement de développement Python le plus puissant Recommandation de PyCharm
L'environnement de développement intégré Python le plus puissant PyCharm
J'étais accro à la création d'un environnement Python venv avec VS Code
Créer un environnement de développement à l'aide de Jupyter et Flask avec Python dans Docker (prend en charge à la fois VS Code / code-server)
Préparer l'environnement d'exécution de Python3 avec Docker
Créer un environnement de développement Python avec Visual Studio Code
Environnement virtuel / package Python (Windows10) avec VSCode
[Python] Créer un environnement de développement Django avec Docker
Utiliser Python dans un environnement Anaconda avec VS Code
Utilisez le conteneur de développement Docker facilement avec VS Code
Créer un environnement d'exécution python avec VS Code
Compilation croisée de Raspberry Pi et création d'un environnement de développement de débogage à distance avec VS Code
Construction d'un environnement d'analyse de données Python facile avec Windows10 Pro x VS Code x Docker
Environnement de développement Python avec Windows + Anaconda3 + Visual Studio Code
Environnement de développement Python avec Windows + Python + PipEnv + Visual Studio Code
Python avec VSCode (Windows 10)
Unifier l'environnement de l'équipe de développement Python en commençant par Poetry
Configurer un environnement de développement Python avec Visual Studio Code
Créer un environnement de développement VS Code + Docker avec une machine virtuelle Linux
Déboguer Python avec VS Code
Préparer l'environnement de développement Python avec Mac + Windows + VisualStudio Code (version Windows)
Préparer l'environnement python3 avec Docker
Préparer l'environnement de développement Python avec Mac + Windows + VisualStudio Code (version Mac)
Créez un environnement de développement Python simple avec VSCode et Docker Desktop
Histoire que Python a cessé de travailler avec VS Code (Windows 10)
Comment entrer dans l'environnement de développement Python avec Vagrant
UpNext2 Development Record # 1 Construire un environnement Python CI dans VS Code
Créer un environnement Python avec WSL + Pyenv + Jupyter + VSCode
Comment développer des conteneurs sur des serveurs distants avec VS Code Remote-Containers
Comment créer un environnement d'exécution Python et Jupyter avec VSCode
Construire un environnement Mysql + Python avec docker
Vérification de l'environnement de développement NAOqi Python
Configurer un environnement de développement Python avec Atom
Reconstruisez l'environnement de développement de Django avec Docker! !! !! !!
Développement d'applications avec Docker + Python + Flask
Installez python avec mac vs code
Préparez l'environnement de développement avec anyenv
Comment déboguer un programme Python en se connectant à distance à un conteneur Docker dans un environnement WSL2 avec VS Code
Créez un environnement de développement Python sur Windows (WSL distant Visual Studio Code).
Procédure de création d'un environnement virtuel Python avec VS Code sous Windows
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
Accéder à l'API Docker Remote avec des requêtes
Environnement de développement Python pour macOS utilisant venv 2016
Créer un environnement Jupyter Lab (Python) avec Docker
[Environnement de développement] Python avec Xcode [Avec transition d'écran]
Utilisation de venv dans un environnement Windows + Docker [Python]
Derrière le flyer: utiliser Docker avec Python
Créer un environnement Python + uWSGI + Nginx avec Docker
Construction de l'environnement de développement Python3 + venv + VSCode + macOS