From 1add20bc5f310f124c4667c600f41f9274fa1de6 Mon Sep 17 00:00:00 2001 From: Arnauld <biganzoli@laplace.univ-tlse.fr> Date: Sun, 19 Jan 2025 01:48:19 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20du=20fichier=20sur=20la=20m=C3=A9thodol?= =?UTF-8?q?ogie=20de=20dev=20en=20Python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 38 ++++++++-- docs/methode-de-developpement-pour-python.md | 73 +++++++++++++++++++ images/logo-laplace.png | Bin 0 -> 9911 bytes 3 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 docs/methode-de-developpement-pour-python.md create mode 100644 images/logo-laplace.png diff --git a/README.md b/README.md index 77bed9a..6e93bee 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,26 @@ -# Référentiel de projets Python - Service commun d'électronique +<h2>Référentiel de projets Python - Service commun d'électronique<h/2> -Bienvenue dans ce référentiel ! Vous trouverez ici une collection de mes projets Python développés au sein du service commun d'électronique. +**Bienvenue dans ce référentiel !** Vous trouverez ici une collection de liens vers mes projets Python développés au sein du service commun d'électronique. + +- [Objectifs](#objectifs) +- [Structure](#structure) +- [Contribution](#contribution) +- [📄 Licence](#-licence) + +--- + +<br /> ## Objectifs * Exploration de projets Python par des retours d'expérience à travers une veille technologique +* Explication de ma méthodologie de travailler avec Python ## Structure -* Premier partage autour de la lecture des données de multimètres numériques de chez Keysight +* [Premier partage autour de la lecture des données de multimètres numériques de chez Keysight][link_multimeters_py] +* [Partage d'un scripts pour la recherche de valeurs de résistances pour un pont diviseur de tension][link_resistor_calculator_py] +* Prochainement, partage de scripts pour la communication avec des cartes d'acquisition de données ## Contribution @@ -18,12 +30,24 @@ N'hésitez pas à contribuer à ce référentiel en : * M'aider à améliorer la documentation existante * Faire remonter et proposer des corrections de bugs -## Licence +**Contact:** + +Vous pouvez me contacter par mail à l'adresse [arnauld.biganzoli[at]laplace.univ-tlse.fr](mailto:arnauld.biganzoli@laplace.univ-tlse.fr?subject=Contact%20projets%20Python%20du%20GitLab%20Koda%20du%20SCE) -Copyright (c) 2025 LAPLACE, UMR INP-UPS-CNRS N°5213 +## 📄 Licence Ce projet est sous licence [CeCILL-C](https://cecill.info/licences/Licence_CeCILL-C_V1-fr.html) -**Contact:** +image::https://img.shields.io/badge/License-CeCILL--C-blue.svg[link="https://cecill.info/licences/Licence_CeCILL-C_V1-fr.html", alt="License CeCILL-C", title="License CeCILL-C"] -Vous pouvez me contacter par mail à l'adresse [arnauld.biganzoli[at]laplace.univ-tlse.fr](mailto:arnauld.biganzoli@laplace.univ-tlse.fr?subject=Contact%20projets%20Python%20du%20GitLab%20Koda%20du%20SCE) + + +Copyright (c) 2025 LAPLACE, UMR INP-UPS-CNRS N°5213 + +--- + +<!-- Retrouvez ce projet sur le GitLab du service commun d'électronique : --> + +[link_multimeters_py]: https://src.koda.cnrs.fr/laplace-service-commun-electronique/membres/arnauld-biganzoli/python/visa-communication-with-digital-multimeters + +[link_resistor_calculator_py]: https://src.koda.cnrs.fr/laplace-service-commun-electronique/membres/arnauld-biganzoli/python/calculateur-de-resistances-pour-pont-diviseur-de-tension diff --git a/docs/methode-de-developpement-pour-python.md b/docs/methode-de-developpement-pour-python.md new file mode 100644 index 0000000..0cf30a4 --- /dev/null +++ b/docs/methode-de-developpement-pour-python.md @@ -0,0 +1,73 @@ +<h2>Méthodologie de developpement en langage Python</h2> + +**Sommaire :** + +- [Installation de l'environnement Python](#installation-de-lenvironnement-python) +- [Installation d'un environnement virtuel pour chaque projet](#installation-dun-environnement-virtuel-pour-chaque-projet) +- [Activer votre environnement virtuel](#activer-votre-environnement-virtuel) +- [Installation des bibliothèques Python](#installation-des-bibliothèques-python) +- [Exécuter un programme Python](#exécuter-un-programme-python) + +--- + +<br /> + +## Installation de l'environnement Python + +Pour exécuter les scripts Python, vous devez disposer d'un environnement Python fonctionnel. + +La version de Python recommandée pour ces scripts est la version `3.12.5` + +Plusieurs options s'offrent à vous pour installer Python sur votre ordinateur : + +* Télécharger et installer Python depuis le site officiel [Python.org](https://www.python.org/downloads/). +* Passer par l'environnment [Anaconda](https://www.anaconda.com/products/distribution) qui est une distribution de Python qui inclut de nombreuses bibliothèques utiles dans le monde scientifique. +* Utiliser un gestionnaire des versions de Python, qui vous permettra de faire plusieurs installations de Python en parallèle. Voir [pyenv-win](https://github.com/pyenv-win/pyenv-win) qui est une version de pyenv pour Windows que j'utilise ici. + +## Installation d'un environnement virtuel pour chaque projet + +Pour chaque projet, je vous recommande de créer un environnement virtuel dédié. Cela vous permettra de gérer les dépendances de chaque projet de manière indépendante. + +Pour cela, vous pouvez utiliser le module `venv` de Python avec la version de Python que vous avez installée, est qui est compatible avec votre projet et les versions des bibliothèques que vous utiliserez. + +Pour créer un environnement virtuel, vous pouvez exécuter la commande suivante dans un terminal. + +Cette commande crée un dossier `.env` dans le répertoire courant qui contiendra l'environnement virtuel Python pour l'exécution de votre projet : + +```bash +python -m venv .env +``` + +## Activer votre environnement virtuel + +Placez vous dans le répertoire de votre projet, puis activez l'environnement virtuel que vous avez créé. + +Exécutez la commande suivante dans un terminal pour l'activer : + +```bash +`source .env/bin/activate` (sous Linux/macOS) ou `> .env\Scripts\activate` (sous Windows) +``` + +Une autre option est d'utiliser l'extension [Python pour Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python), qui vous permet de sélectionner l'environnement virtuel à utiliser pour chaque projet. + +## Installation des bibliothèques Python + +Pour installer les bibliothèques nécessaires, vous pouvez utiliser le gestionnaire de paquets `pip`. + +Pour cela, soit vous installez les bibliothèques une par une, soit vous utilisez le fichier `requirements.txt` fourni dans le projet. + +Exécutez la commande suivante dans un terminal : + +```bash +pip install -r requirements.txt +``` + +## Exécuter un programme Python + +Vous êtes maintenant prêt à éxécuter un programme python depuis un terminal ou l'environnement de développement de votre choix. Ma recommandation est d'utiliser [Visual Studio Code](https://code.visualstudio.com/). + +Exemple d'exécution d'un programme Python depuis un terminal : + +```bash +(.env) > python src\example.py +``` diff --git a/images/logo-laplace.png b/images/logo-laplace.png new file mode 100644 index 0000000000000000000000000000000000000000..2da1ff5b44643d54af3337bd9aa79b07a83bb466 GIT binary patch literal 9911 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 S_-_&oL0Miyu1>}x?Ee9CcU^=4 literal 0 HcmV?d00001 -- GitLab