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
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
Tout d'abord, créez un répertoire de développement approprié et ouvrez-le avec VS Code.
$ mkdir python-test
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.
Si vous l'avez installé avec succès, vous verrez un bouton vert en bas à gauche de VS Code.
Lorsque vous l'ouvrez, vous verrez un menu comme celui-ci,
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.
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.
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 ... ".
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.
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
.
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é, ...
Puisque result2 est un type int, le type str ne peut pas être assigné!
Les opérateurs str et int +
ne sont pas définis! !!
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! !! !!
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.
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