{"id":5773,"date":"2024-08-29T05:28:12","date_gmt":"2024-08-29T05:28:12","guid":{"rendered":"https:\/\/wikiform.fr\/codespace\/creer-et-gerer-des-packages-en-python\/"},"modified":"2024-08-29T05:28:15","modified_gmt":"2024-08-29T05:28:15","slug":"creer-et-gerer-des-packages-en-python","status":"publish","type":"post","link":"https:\/\/wikiform.fr\/codespace\/creer-et-gerer-des-packages-en-python\/","title":{"rendered":"4.5 Cr\u00e9er et G\u00e9rer des Packages en Python"},"content":{"rendered":"\n<p><strong>Cr\u00e9er et G\u00e9rer des Packages en Python<\/strong> est une comp\u00e9tence essentielle pour tout d\u00e9veloppeur souhaitant organiser efficacement son code et le r\u00e9utiliser dans diff\u00e9rents projets. Apprenons comment cr\u00e9er, structurer et g\u00e9rer des packages Python avec des exemples pratiques.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction \u00e0 la Cr\u00e9ation et \u00e0 la Gestion des Packages en Python<\/h2>\n\n\n\n<div id=\"videoContainer\" style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; background: #000;\">\n  <iframe src=\"https:\/\/player.vimeo.com\/video\/583347455?dnt=1&#038;fullscreen=0&#038;pip=0\" loading=\"lazy\" loading=\"lazy\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" frameborder=\"0\" allow=\"autoplay\" allowfullscreen id=\"vimeoPlayer\"><\/iframe>\n  \n  <!-- Popup Desktop -->\n  <div id=\"popupContainer\" class=\"desktop-popup\" style=\"display: none; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 90%; max-width: 400px; padding: 20px; border-radius: 10px; text-align: center; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); background-color: rgba(255, 255, 255, 0.95); box-sizing: border-box;\">\n    <h2 style=\"color: #333; font-size: 1.5em; margin: 10px 0;\" id=\"profitez-de-loffre-spciale-\">Profitez de l\u2019offre sp\u00e9ciale !<\/h2>\n    <p style=\"color: #e74c3c; font-size: 1.2em; margin: 10px 0;\">Obtenez notre cours pour seulement <strong id=\"price\">29.5\u20ac<\/strong> au lieu de <del>59\u20ac<\/del> !<\/p>\n    <a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\" target=\"_blank\" style=\"display: block; padding: 10px 20px; background-color: #701CF5; color: #fff; text-decoration: none; border-radius: 5px; font-weight: bold; font-size: 1em; margin: 20px auto;\" rel=\"noopener\">Commencer maintenant<\/a>\n    <button onclick=\"closePopup()\" style=\"padding: 10px 20px; font-size: 1em;\">Fermer<\/button>\n  <\/div>\n\n  <!-- Popup Mobile -->\n  <div id=\"popupContainerMobile\" class=\"mobile-popup\" style=\"display: none; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 80%; max-width: 300px; padding: 15px; border-radius: 10px; text-align: center; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); background-color: rgba(255, 255, 255, 0.95); box-sizing: border-box;\">\n    <p style=\"color: #e74c3c; font-size: 1em; margin: 5px 0;\">Cours sp\u00e9cial \u00e0 <strong id=\"priceMobile\">29.5\u20ac<\/strong> au lieu de <del>59\u20ac<\/del> !<\/p>\n    <a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\" target=\"_blank\" style=\"display: inline-block; padding: 8px 15px; background-color: #701CF5; color: #fff; text-decoration: none; border-radius: 5px; font-weight: bold; font-size: 0.9em;\" rel=\"noopener\">Commencer maintenant<\/a>\n    <button onclick=\"closePopup()\" style=\"padding: 5px 10px; font-size: 0.9em;\">Fermer<\/button>\n  <\/div>\n<\/div>\n\n<script src=\"https:\/\/player.vimeo.com\/api\/player.js\"><\/script>\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n    var iframe = document.getElementById('vimeoPlayer');\n    var player = new Vimeo.Player(iframe);\n    var isPopupDisplayed = false;\n\n    player.on('play', function() {\n        if (!isPopupDisplayed) {\n            player.on('timeupdate', function(data) {\n                if (data.seconds >= 120 && !isPopupDisplayed) { \/\/ 120 seconds = 2 minutes\n                    \/\/ Pause the video and display the popup\n                    player.pause().then(function() {\n                        if (window.innerWidth > 768) {\n                            document.querySelector('.desktop-popup').style.display = 'block';\n                        } else {\n                            document.querySelector('.mobile-popup').style.display = 'block';\n                        }\n                        fetchPriceAndUpdatePopup();\n                        isPopupDisplayed = true;\n                    });\n                }\n            });\n        }\n    });\n\n    function fetchPriceAndUpdatePopup() {\n        fetch('https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144')\n            .then(response => response.text())\n            .then(html => {\n                var parser = new DOMParser();\n                var fetchedDoc = parser.parseFromString(html, 'text\/html');\n                var priceElement = fetchedDoc.querySelector('.ammount .fw-500');\n                var originalPriceElement = fetchedDoc.querySelector('.ammount del');\n                var price = priceElement ? priceElement.textContent.trim() : '29.5\u20ac';\n                var originalPrice = originalPriceElement ? originalPriceElement.textContent.trim() : '59\u20ac';\n\n                document.getElementById('price').textContent = price;\n                document.getElementById('priceMobile').textContent = price;\n                document.querySelector('.desktop-popup del').textContent = originalPrice;\n                document.querySelector('.mobile-popup del').textContent = originalPrice;\n            })\n            .catch(error => console.error('Error fetching the price:', error));\n    }\n\n    function closePopup() {\n        document.querySelector('.desktop-popup').style.display = 'none';\n        document.querySelector('.mobile-popup').style.display = 'none';\n        player.play(); \/\/ Allows resuming the video only after closing the popup\n    }\n});\n<\/script>\n\n\n\n<p>Un package en Python est un moyen de regrouper des modules Python logiquement associ\u00e9s afin de les structurer et les maintenir plus ais\u00e9ment. Les packages permettent d\u2019\u00e9viter les conflits de noms et de distribuer du code r\u00e9utilisable sous forme de biblioth\u00e8ques. Apprenons comment cr\u00e9er et g\u00e9rer des packages \u00e0 travers ce tutoriel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Structure de Base d\u2019un Package en Python<\/h3>\n\n\n\n<p>Pour cr\u00e9er un package en Python, il suffit de cr\u00e9er un r\u00e9pertoire avec un fichier <code>__init__.py<\/code>. Ce fichier de configuration indique \u00e0 Python que le r\u00e9pertoire doit \u00eatre trait\u00e9 comme un package. Voici un exemple de structure de base :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>project\/\n\u2502\n\u251c\u2500\u2500 setup.py\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 mypackage\/\n\u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u251c\u2500\u2500 module1.py\n\u2502   \u251c\u2500\u2500 module2.py\n\u2502   \u2514\u2500\u2500 subpackage1\/\n\u2502       \u251c\u2500\u2500 __init__.py\n\u2502       \u2514\u2500\u2500 submodule1.py\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9er le fichier __init__.py<\/h3>\n\n\n\n<p>Le fichier <code>__init__.py<\/code> peut \u00eatre vide, ou il peut contenir du code d\u2019initialisation pour le package. Par exemple, vous pouvez d\u00e9finir les fonctions ou les classes que vous souhaitez importer depuis le package principal :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code># mypackage\/__init__.py\nfrom .module1 import function1\nfrom .module2 import class1\n\n__all__ = ['function1', 'class1']\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9er des Modules et Sous-packages<\/h3>\n\n\n\n<p>Chaque module est simplement un fichier Python (<code>.py<\/code>). Pour des projets plus complexes, vous pouvez organiser vos modules en sous-packages en r\u00e9p\u00e9tant la m\u00eame structure avec des r\u00e9pertoires contenant des fichiers <code>__init__.py<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code># mypackage\/module1.py\ndef function1():\n    print(\"Hello from module1\")\n\n# mypackage\/module2.py\nclass class1:\n    def __init__(self):\n        print(\"Hello from class1 in module2\")\n\n# mypackage\/subpackage1\/submodule1.py\ndef subfunction1():\n    print(\"Hello from submodule1 in subpackage1\")\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Utiliser les Modules d\u2019un Package<\/h3>\n\n\n\n<p>Une fois que votre package est structur\u00e9, vous pouvez facilement l\u2019importer et utiliser ses modules dans vos scripts :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code># main.py\nimport mypackage\n\nmypackage.function1()\n\nobj = mypackage.class1()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Packager et Distribuer votre Code<\/h3>\n\n\n\n<p>Pour partager vos packages avec la communaut\u00e9 ou les utiliser dans d\u2019autres projets, vous devez les packager et les distribuer. Cela peut \u00eatre fait \u00e0 l\u2019aide de <code>setuptools<\/code> et en cr\u00e9ant un fichier <code>setup.py<\/code>. Voici un exemple de <code>setup.py<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code># setup.py\nfrom setuptools import setup, find_packages\n\nsetup(\n    name='mypackage',\n    version='0.1',\n    packages=find_packages(),\n    author='Votre Nom',\n    author_email='votre.email@example.com',\n    description='Un exemple de package Python',\n    url='http:\/\/example.com',\n    install_requires=[\n        'some_dependency',\n    ],\n)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Publier votre Package sur PyPI<\/h3>\n\n\n\n<p>Pour publier votre package sur le Python Package Index (PyPI), vous avez besoin de cr\u00e9er un compte sur <a href=\"https:\/\/pypi.org\/\" target=\"_blank\" rel=\"noopener\">PyPI<\/a> et suivre les instructions de <a href=\"https:\/\/packaging.python.org\/tutorials\/packaging-projects\/\" target=\"_blank\" rel=\"noopener\">ce tutoriel officiel<\/a>. Voici quelques lignes de commande pour commencer :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-bash\"><code># G\u00e9n\u00e9rer les fichiers de distribution\npython setup.py sdist bdist_wheel\n\n# Installer Twine si ce n'est pas d\u00e9j\u00e0 fait\npip install twine\n\n# T\u00e9l\u00e9charger le package sur PyPI\ntwine upload dist\/*\n\n<\/code><\/pre>\n\n\n\n<p>Ce processus rendra votre package disponible pour toute la communaut\u00e9 Python, et vous pourrez l\u2019installer avec la commande <code>pip install mypackage<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">G\u00e9rer les D\u00e9pendances de votre Package<\/h3>\n\n\n\n<p>Lorsque vous \u00e9crivez des packages complexes qui d\u00e9pendent d\u2019autres biblioth\u00e8ques, vous devez vous assurer que ces d\u00e9pendances sont correctement d\u00e9clar\u00e9es. Le fichier <code>requirements.txt<\/code> fonctionne bien pour les projets, mais pour un package, vous devez sp\u00e9cifier les d\u00e9pendances dans le fichier <code>setup.py<\/code> sous <code>install_requires<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>install_requires=[\n    'requests>=2.20.0',\n    'numpy>=1.18.0',\n]\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Tests et Documentation de votre Package<\/h3>\n\n\n\n<p>Il est crucial d&rsquo;inclure des tests et une documentation pour votre package afin d\u2019en assurer la qualit\u00e9 et faciliter son utilisation par d&rsquo;autres. Utilisez des outils comme <code>unittest<\/code> ou <code>pytest<\/code> pour les tests, et <code>Sphinx<\/code> pour g\u00e9n\u00e9rer une documentation bien structur\u00e9e.<\/p>\n\n\n\n<p>Par exemple, pour <a href=\"https:\/\/wikiform.fr\/codespace\/ouvrir-et-exploiter-un-fichier-en-python\">ouvrir et exploiter un fichier en Python<\/a> de mani\u00e8re automatis\u00e9e, des tests sont essentiels pour valider les fonctionnalit\u00e9s. De plus, avec l&rsquo;utilisation de <a href=\"https:\/\/wikiform.fr\/codespace\/gestion-des-paquets-python-avec-pip-tutoriel\">pip<\/a> pour la gestion des paquets, vous pouvez inclure des packages suppl\u00e9mentaires sans tracas. La documentation, quant \u00e0 elle, vous aidera \u00e0 expliquer comment structurer et utiliser les sous-packages comme illustr\u00e9 dans ce <a href=\"https:\/\/wikiform.fr\/codespace\/creer-des-modules-en-python-guide-pratique\">guide pratique sur la cr\u00e9ation de modules en Python<\/a>.<\/p>\n\n\n\n<p>En r\u00e9sum\u00e9, la cr\u00e9ation et la gestion de packages en Python permettent de structurer le code efficacement, d\u2019encourager la r\u00e9utilisation et de partager ses r\u00e9alisations avec la communaut\u00e9. En ma\u00eetrisant cet aspect de Python, vous serez mieux arm\u00e9 pour d\u00e9velopper des projets plus larges et complexes de mani\u00e8re professionnelle.<\/p>\n\n\n\n<a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/wikiform.fr\/codespace\/wp-content\/uploads\/2024\/07\/learnify-formation-PYTHON-offre-50.gif\" loading=\"lazy\" alt=\"Learnify Formation Python Offre 50%\" title=\"\"><\/a>\n.\n\n\n<h2 class=\"wp-block-heading\">Personnaliser votre Package Python<\/h2>\n\n\n\n<p>Dans certains cas, vous pourriez vouloir personnaliser davantage votre package Python. Voici quelques approches suppl\u00e9mentaires pour le faire :<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ajout de M\u00e9tadonn\u00e9es<\/h3>\n\n\n\n<p>Les m\u00e9tadonn\u00e9es sont des informations qui d\u00e9crivent le package, comme son nom, sa version, son auteur, et plus encore. Dans le fichier <code>setup.py<\/code>, vous pouvez ajouter des metadata comme suit :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code># setup.py\nsetup(\n    name='mypackage',\n    version='0.1',\n    packages=find_packages(),\n    author='Votre Nom',\n    author_email='votre.email@example.com',\n    description='Un exemple de package Python',\n    url='http:\/\/example.com',\n    long_description=open('README.md').read(),\n    long_description_content_type='text\/markdown',\n    classifiers=[\n        'Programming Language :: Python :: 3',\n        'License :: OSI Approved :: MIT License',\n        'Operating System :: OS Independent',\n    ],\n    python_requires='>=3.6',\n)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Automatiser le D\u00e9ploiement<\/h3>\n\n\n\n<p>Automatiser le processus de d\u00e9ploiement de votre package peut r\u00e9duire les erreurs et augmenter l&rsquo;efficacit\u00e9. Vous pouvez utiliser des outils comme <a href=\"https:\/\/github.com\/features\/actions\" target=\"_blank\" rel=\"noopener\">GitHub Actions<\/a> ou <a href=\"https:\/\/circleci.com\/\" target=\"_blank\" rel=\"noopener\">CircleCI<\/a> pour cr\u00e9er des pipelines CI\/CD (Int\u00e9gration continue et Livraison continue). Par exemple, pour automatiser le d\u00e9ploiement sur PyPI, vous pouvez configurer une action GitHub :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-yaml\"><code>name: Python package\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  publish:\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Check out the code\n      uses: actions\/checkout@v2\n\n    - name: Set up Python\n      uses: actions\/setup-python@v2\n      with:\n        python-version: '3.x'\n\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install setuptools wheel twine\n\n    - name: Build and publish\n      env:\n        TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}\n        TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}\n      run: |\n        python setup.py sdist bdist_wheel\n        twine upload dist\/*\n<\/code><\/pre>\n\n\n<!--","protected":false},"excerpt":{"rendered":"<p>Cr\u00e9er et G\u00e9rer des Packages en Python est une comp\u00e9tence essentielle pour tout d\u00e9veloppeur souhaitant organiser efficacement son code et le r\u00e9utiliser dans diff\u00e9rents projets&#8230;.<\/p>\n","protected":false},"author":4,"featured_media":2909,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[24],"tags":[18],"class_list":["post-5773","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","tag-tutoriels"],"acf":[],"_titre_de_la_formation":null,"_description_":null,"_objectifs_pedagogiques":null,"_programme_":null,"_url_de_limage":null,"_materiel_necessaire":null,"_modalites_devaluation_des_acquis":null,"_moyens_pedagogiques_et_techniques":null,"_accessibilite_":null,"_formateur_":null,"menu_order":0,"_links":{"self":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5773","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/comments?post=5773"}],"version-history":[{"count":1,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5773\/revisions"}],"predecessor-version":[{"id":5774,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5773\/revisions\/5774"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/media\/2909"}],"wp:attachment":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/media?parent=5773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/categories?post=5773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/tags?post=5773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}