Aller au contenu

6. Python

6.1 Qu'est-ce que Python ?

Selon Wikipédia :

Python est un langage de programmation objet, multi-paradigme et multiplateformes. [...] Il peut s'utiliser dans de nombreux contextes et s'adapter à tout type d'utilisation grâce à des bibliothèques spécialisées. Il est cependant particulièrement utilisé comme langage de script pour automatiser des tâches simples mais fastidieuses.

La première version publique de Python est sortie en 1991. Son auteur, le programmeur Guido van Rossum, était un fan de la série télévisée Monty Python's Flying Circus, une série humoristique sous forme de sketches. C'est de cette série que le langage de programmation tient son nom.

Python est un langage de programmation interprété. Il est reconnu pour sa syntaxe concise et élégante ainsi que la rapidité avec laquelle il permet de développer un programme. De plus, il est possible de lui programmer des modules d'extension en C ou en C++.

Ces caractéristiques combinées au fait qu'il est un logiciel libre font de lui un langage de progammation très prisé.

Pour plus d'information

« Learning Python: From Zero to Hero ». Medium. https://medium.freecodecamp.org/learning-python-from-zero-to-hero-120ea540b567

« The Python Tutorial ». Python. https://docs.python.org/3.6/tutorial/index.html

« Python 3.6.4 documentation ». Python. https://docs.python.org/3.6/index.html

« Apprendre le langage de programmation python ». apprendre-python.com. http://apprendre-python.com/

« Apprenez à programmer en Python ». Open Classrooms. https://openclassrooms.com/courses/apprenez-a-programmer-en-python

« Introduction au langage de programmation Python 3 ». Fabrice Sincère. http://fsincere.free.fr/isn/python/cours_python.php?version=3

« Petites choses diverses à savoir pour débuter en Python ». Formation Django. http://www.formation-django.fr/python/petites-choses-a-savoir.html

6.2 Python 2.X vs 3.X

Comme tout langage de programmation, Python a subi de nombreuses modifications à mesure qu'il évoluait et prenait de la maturité. À un certain stade, ses concepteurs sont venus à un point où ils ont dû briser la compatibilité avec les anciennes versions afin d'offrir de nouvelles possibilités.

C'est pour cette raison qu'il existe deux « familles » de programmes Python : ceux qui sont conçus pour la branche 2.X et ceux pour la branche 3.X.

La version 2.7 est la dernière version de la première branche. Aucune autre version majeure ne sera produite pour la branche 2.X. Elle n'évoluera donc plus mais en revanche, elle est très stable et ceci est vu d'un bon oeil par de nombreux programmeurs.

Dans la branche 3.X, qui évolue depuis 2008, de nombreuses modifications et ajouts visent à améliorer l'expérience des programmeurs et les performances des programmes. C'est pourquoi cette branche est vue comme le présent et le futur de Python.

Si vous hésitez entre Python 2.X et 3.X, vous devriez choisir 3.X. Le seul cas où Python 2.X devrait être utilisé est lorsque vous n'avez pas le choix, par exemple lorsque vous avez besoin d'un paquet qui n'a pas été migré vers 3.X.

Voici, à titre d'exemple, une différence importante entre Python 2.X et 3.X : la commande print est devenue une fonction. À elle seule, cette différence a empêché la rétro-compatibilité avec de nombreux programmes.

Python 2.X

print "Hello World"

Python 3.X

print("Hello World")

Vérifier si Python est installé

Dans une fenêtre Terminal, vous pouvez lancer cette commande pour vérifier si Python est installé et obtenir le numéro de version :

Terminal

python --version

Sous Raspberry Pi OS 10 (Buster), cette commande donne le résultat suivant :

Résultat à l'écran

Python 2.7.16

Plusieurs versions de Python peuvent cohabiter. Pour vérifier si Python 3 est installé :

Terminal

python3 --version

Résultat à l'écran

Python 3.7.3

Ainsi, on voit que lors de l'installation de Raspberry Pi OS 10 (Buster), Python 2.7 et Python 3.7 sont installés par défaut.

Afficher la version de Python par programmation

Il est possible d'afficher la version de Python par programmation. Ceci générera un affichage à la console :

Python

import platform
platform.python_version()

Pour plus d'information

« Should I use Python 2 or Python 3 for my development activity? ». Python. https://wiki.python.org/moin/Python2orPython3

6.3 Shebang ou hash bang : #!

Les script Python commencent généralement par une ligne qui débute par les caractères #! suivis par le chemin de l'interpréteur Python. Cette ligne se nomme shebang ou hash bang.

La présence du shebang permet d'appeler le script Python sans avoir à préciser le nom de son interpréteur.

L'usager devra avoir les droits d'exécution sur le script.

Terminal

chmod u+x mon_script.py

Le script pourra être appelé comme suit :

Terminal

./mon_script.py

Shebang qui utilise la variable d'environnement $PATH

La meilleure technique consiste à utiliser /usr/bin/env devant le nom de l'interpréteur.

Cette formulation fait en sorte que le système retrouvera le chemin exact de l'interpréteur à partir de la variable d'environnement $PATH de l'usager.

Ceci assure un maximum de compatibilité si le script doit être exécuté sur un autre système ou même par un autre usager.

Python

#!/usr/bin/env python3

Shebang fixe

Parfois, on retrouve plutôt ceci, qui correspond au chemin donné lorsqu'on entre la commande which python3 dans une fenêtre terminal.

Python

#!/usr/bin python3

Remarquez qu'il n'y a pas de barre oblique avant le mot python3.

Cette formulation fonctionne également mais elle risque de ne plus fonctionner si le script est utilisé sur un autre système ou par un autre usager.

Script sans shebang

Dans le cas où le script Phython ne débute pas par un shebang, il faudra ajouter python3 devant son nom pour pouvoir l'exécuter.

Notez qu'à ce moment, l'usager n'a pas besoin d'avoir les droits d'exécution sur le fichier.

Terminal

python3 mon_script.py

6.4 Exécuter un programme Python dans une fenêtre Terminal

Pour tester un programme Python, il est possible de l'exécuter dans une fenêtre Terminal.

Déplacez-vous dans le dossier qui contient le programme puis tapez son nom avec son extension.

Exemple sous Windows :

Fenêtre de commande DOS

cd \Users\votrenom\Documents\mondossier
helloworld.py

Exemple sous Mac ou Linux :

Terminal

cd ~/mondossier
./helloworld.py

Il est également possible d'exéuter le programme en faisant appel à la commande python (pour Python 2.7) ou python3.

Terminal

cd ~/mondossier
python3 helloworld.py

6.5 Les structures de contrôle

Les structures de contrôles permettent de contrôler le flux d'un programme grâce à des conditions et à des boucles.

La condition

Ex :

Python

if nom == 'Annie':
...
elif nom == 'Toto':
...
else:
...

Note : l'indentation (4 espaces) est importante : c'est elle qui indique quand un bloc d'instruction se termine.

La boucle while

Pour boucler tant qu'une condition est vraie.

Ex :

Python

while x < 10:
...

La boucle for

Cette boucle permet de faire une itération un nombre défini de fois.

Ex :

Python

for i in range(10):
...

Boucler dans les éléments d'une liste

Ex :

Python

valeurs = ['a', 'b', 'c']
for valeur in valeurs:
...

6.6 Utilisation d'un paquet ou d'un module

Pour utiliser un module ou un paquet, peut importe s'il fait partie de la bibliothèque standard ou s'il est externe, faut débuter le script Python par une instruction import.

Bien entendu, un module ou un paquet externe devra d'abord être installé sur votre poste de travail.

Par exemple, pour utiliser le module calendar :

Python

import calendar
...
if calendar.isleap(annee):
...

Instruction from ... import ...

Lorsqu'on utilise l'instruction import, chaque classe ou fonction importée doit être précédée par le nom du module ou du paquet, comme démontré plus haut avec calendar.isleap().

Il est possible de modifier ce comportement à l'aide de la syntaxe from ... import *. Les classes et fonctions seront désormais accessibles comme si elles faisaient partie du coeur de Python.

Python

from calendar import \*
...
if isleap(annee):
...

Autre exemple :

Python

from tkinter import \*
...
canevas = Canvas(fenetre, width=150, height=150)
...

Paquet contenant plusieurs modules

Puisqu'un paquet est un dossier qui contient des modules, Python devait avoir un moyen de comprendre ce qu'il doit faire lorsqu'on lui lance une instruction import sur un paquet.

Dans les faits, lorsqu'il rencontre le nom d'un paquet dans une instruction import, Python recherchera un fichier nommé init.py dans ce dossier. Autrement dit, l'importation d'un paquet consiste à importer le module init présent dans ce paquet.

Certains paquets sont configurés pour que tous leurs modules soient importés automatiquement. D'autres laissent le soin au programmeur d'importer seulement les modules désirés.

C'est pourquoi, lorsque vous avez besoin d'une fonction ou d'une classe définie dans un autre module du paquet, il se peut que vous ayez besoin de faire une importation précise du module désiré.

La syntaxe à utiliser est sous la forme :

Syntaxe Python

from paquet.module import fonction

ou

Syntaxe Python

from paquet.module import Classe

ou encore, si le nombre de classes ou de fonctions à utiliser est important :

Syntaxe Python

from paquet.module import \*

Ex :

Python

from tkinter.font import Font
police = Font(family='Helvetica', size=12, weight='normal')
...

Pour plus d'information

« Python 101: All about imports ». Mouse vs Python. https://www.blog.pythonlibrary.org/2016/03/01/python-101-all-about-imports/

« The Python Standard Library ». Python. https://docs.python.org/3/library/index.html

« UsefulModules ». Python. https://wiki.python.org/moin/UsefulModules

« PyPI - the Python Package Index ». Python. https://pypi.python.org/pypi

« Python 3 Module of the Week ». PyMOTW-3. https://pymotw.com/3/index.html

« Les imports en Python ». Sam & Max. http://sametmax.com/les-imports-en-python/

« Structuring Your Project - Packages ». The Hitchhiker's guide to Python. http://docs.python-guide.org/en/latest/writing/structure/#packages

6.7 À quel endroit Python recherche-t-il les modules?

Si un programme Python utilise un module sans savoir à quel endroit il est placé, vous obtiendrez une erreur du genre :

Résultat à l'écran

Traceback (most recent call last):
File "./mon_programme.py", line 4, in <module>
import mon_module
ModuleNotFoundError: No module named 'mon_module'

Lorsqu'il rencontre une instruction import, Python recherchera un fichier dont le nom est identique au nom du module, avec l'extension .py.

Il recherchera ce fichier :

  • dans le dossier courant
  • dans la liste des dossiers de la variable d'environnement Python sys.path
  • dans la liste des dossiers de la variable d'environnement de l'OS PYTHONPATH

sys.path

Pour connaître la valeur de sys.path, entrez ce code à la ligne de commande Python (rappel : entrez python3 dans une fenêtre Terminal pour obtenir la ligne de commande Python).

Python

>>> import sys
>>> for path in sys.path:
... print(path)

Appuyez deux fois sur Retour et vous verrez la liste des dossiers apparaître.

Sur Raspberry Pi OS, voici ce que j'obtiens.

Résultat à l'écran

/usr/lib/python37.zip
/usr/lib/python3.7
/usr/lib/python3.7/lib-dynload
/usr/local/lib/python3.7/dist-packages
/usr/lib/python3/dist-packages

Vous pouvez ajouter un dossier à sys.path par programmation :

Python

import sys
sys.path.append("/chemin/dossier-a-ajouter")

PYTHONPATH

Pour connaître la valeur de PYTHONPATH sur un système Linux ou Mac :

Terminal

echo $PYTHONPATH

Et sur un système Windows :

Invite de commande (CMD)

echo %PYTHONPATH%

Il est possible d'ajouter du contenu à cette variable. Mais attention : ceci sera valable jusqu'à ce que l'ordinateur soit redémarré.

Sour Linux ou Mac :

Terminal

export PHTYONPATH=$PYTHONPATH:/chemin/dossier-a-ajouter

ou

Terminal

cd /chemin/dossier-a-ajouter
export PYTHONPATH=$PYTHONPATH:$PWD

Sous Windows :

Invite de commande (CMD)

set PYTHONPATH=%PYTHONPATH%;C:\chemin\dossier-a-ajouter

Les dossiers ajoutés ainsi à PYTHONPATH seront automatiquement ajoutés à sys.path.

Si vous voulez faire un ajout permanent, ajoutez cette instruction dans le fichier .bashrc ou, si vous travaillez sous Windows, passez par le panneau de configuration.

Pour plus d'information

« Where does Python look for modules? ». Matthew Brett. https://bic-berkeley.github.io/psych-214-fall-2016/sys_path.html

« Python import, sys.path, and PYTHONPATH Tutorial ». Dev Dungeon. https://www.devdungeon.com/content/python-import-syspath-and-pythonpath-tutorial#:~:text=PYTHONPATH%20is%20related%20to%20sys,for%20modules%20when%20using%20import%20.

6.8 Les tableaux, listes et tuples

Tuple

En Python, un tuple est un tableau immuable et très performant. On utilisera les parenthèses pour l'initialiser.

Ex :

Python

valeurs = ('a', 'b', 'c')

Dans le cas où il y a un seul élément dans le tuple, on doit faire suivre cet élément par une virgule afin que Python comprenne qu'il ne s'agit pas d'une chaîne de caractères entourée de parenthèses.

Ex :

Python

valeurs = ('a',)

Liste

Une liste est un tableau modifiable de longueur variable. On utilisera les crochets carrés pour l'initialiser.

Ex :

Python

valeurs = ['a', 'b', 'c']

Tableau associatif (dictionnaire)

Un tableau associatif est caractérisé par des éléments qui portent un nom plutôt qu'un indice. On utilisera les accolades pour l'initialiser.

Ex :

Python

configuration = {
'menu': 'gauche',
'langue': 'fr'
}
...
valeur = configuration['langue']

6.9 Écrire nos propres fonctions

Il est très rare qu'une application soit écrite tout d'un bout sans utiliser de fonctions.

On utilisera souvent des fonctions qui font partie intégrante de Python (ex : print()). On parlera de fonctions préprogrammées.

On pourra également coder nos propres fonctions. On parlera alors de fonctions utilisateur, fonctions définies par l'utilisateur ou encore, en anglais, user-defined functions (UDF).

Quel est l'intérêt de coder nos propres fonctions ? Il y a différents raisons qui justifient ce choix :

  • Le même code doit être exécuté à plusieurs endroits dans le programme (principe DRY : Do not Repeat Yourself).
  • Le code devient plus facile à comprendre si une partie du code est placé dans une fonction disticte (principe KISS : Keep It Simple, Stupid !).
  • Il faut attacher du code à un événement (ex : un clic sur un bouton). La fonction permettra de délimiter le code à exécuter lorsque l'événement survient.

Comme dans tous les langages de programmation, lorsqu'on code une fonction, il y a deux étapes à réaliser :

  • la déclaration de la fonction
  • l'appel de la fonction

Déclaration de la fonction

Lorsqu'une fonction est déclarée, son code n'est pas exécuté tout de suite. Il le sera seulement lorsque la fonction sera appelée.

La déclaration d'une fonction se fait à l'aide du mot-clé def. Tout le code de la fonction sera décalé de 4 espaces par rapport au programme principal. Ainsi, Python saura que le code de la fonction est terminé lorsqu'il rencontrera une ligne qui n'est pas décalée.

Ex :

Python

def ma_fonction():
...
...
# cette ligne ne fait pas partie de la fonction

Appel de la fonction

Pour appeler une fonction, il faut écrire son nom suivi de parenthèses :

Python

# la fonction sera exécutée immédiatement
ma_fonction()

Il est également possible de passer des paramètres à la fonction.

Ex :

Python

def afficher_message(message):
...
print(message)
...
afficher_message('Bien le bonjour !')

Documentation de la fonction

Pour chacune des fonctions que vous coderez, il est d'usage de commencer par un commentaire Docstring qui indique ce que la fonction fait. Le commentaire Docstring est constitué d'une ou plusieurs lignes de texte entourées par des triples apostrophes (""").

Ex :

Python

def soumettre_click():
""" Enregistre les informations dans la base de données. """
...

Python

def ma_fonction():
""" Effectue telle ou telle action.
Ceci est un commentaire sur plusieurs lignes.
On laisse généralement une ligne blanche après la première ligne, qui est un sommaire.
Les triple-guillemets peuvent se refermer à droite de la dernière ligne ou encore sur la ligne suivante.
"""
...

Indicatif visuel du début du programme principal

En Python, il faut toujours placer une fonction avant le programme qui l'utilise. C'est pourquoi on retrouvera les définitions de fonctions en haut du programme et le programme principal dans le bas.

Puisque les fonctions doivent être définies avant le programme principal, il est pratique d'ajouter un commentaire qui indique clairement à quel endroit le programme principal commence.

Ex :

Python

def ma_fonction():
...
...
########## programme principal ##########
fenetre = Tk()
...

6.10 Utiliser une variable du programme principal dans une fonction (portée des variables)

Lorsqu'une application Python contient des fonctions utilisateur et que ces fonctions doivent utiliser des variables, il faut prendre le temps de comprendre la portée des variables.

La portée d'une variable (variable scope) indique à quel endroit elle peut être utilisée dans le programme.

Une variable qui est créée dans une fonction ne risque pas d'entrer en conflit avec une autre variable du même nom créée dans une autre fonction ni même avec une variable du même nom créée dans le programme principal.

La portée d'une variable est limitée à la fonction dans laquelle elle a été créée.

Passer un paramètre à la fonction

Il arrive cependant des cas où on voudra créer une variable dans le programme principal et utiliser cette même variable dans une fonction. La technique par excellence consiste à passer la variable en paramètre à la fonction.

Ex :

Python

def afficher_message(nom):
"""Affiche un message avec le nom saisi par l'usager."""
print('Bonjour, ' + nom + ' !')
########## programme principal ##########
nom = input('Quel est ton nom ? ')
afficher_message(nom)

Étendre la portée à l'aide de global

Certaines situations nous empêchent de passer des paramètres à une fonction. Ce sera le cas, notamment, lorsque la fonction est appelée par Python en réponse à un événement.

À ce moment, on pourra indiquer à Python que la variable qu'on utilise dans la fonction est la même que celle créée dans le programme principal. Ceci sera fait à l'aide du mot-clé global.

Soit le programme suivant, qui n'utilise ni paramètre, ni variable globale :

Python

def changer_nom():
"""Change la valeur de la variable nom sans affecter le programme principal."""
nom = 'abc'
########## programme principal ##########
nom = input('Quel est ton nom ? ')
changer_nom()
print('Bonjour, ' + nom + ' !')

Le message utilisera toujours le nom saisi par l'usager et ce, même si la fonction assigne la valeur 'abc' à une variable qui s'appelle elle aussi nom.

Si on voulait changer ce comportement :

Python

def changer_nom():
"""Change la valeur de la variable globale nom, ce qui affectera le programme principal."""
global nom
nom = 'abc'
########## programme principal ##########
nom = input('Quel est ton nom ? ')
changer_nom()
print('Bonjour, ' + nom + ' !')

Cette fois, le programme affichera toujours « Bonjour, abc ! ».

6.11 La programmation objet en Python

Même si les concepts de programmation orientée objet sont les mêmes d'un langage de programmation à l'autre, les différences de syntaxe peuvent parfois être déconcertantes.

Quelques faits saillants :

  • Le nom de la classe est écrit en casse Pascal  Conseil.
  • Si la classe hérite d'une autre classe, on met le nom de la classe de base entre parenthèses.
  • Si la classe n'a pas de parent, on ne met pas de parenthèses.
  • À l'intérieur de la classe, tout le code doit être placé dans une méthode. Seule exception : l'initialisation des variables de classe.
  • Chaque méthode est déclarée avec le mot-clé def.
  • Le constructeur s'appelle init.
  • Le constructeur et les autres méthodes reçoivent toujours self comme premier paramètre.
  • Lors de l'appel d'une méthode, on ignore le paramètre self puisque c'est le noyau qui se chargera de le passer en paramètre.
  • Un point sépare le nom d'un objet de ses membres.
  • Lorsqu'une méthode doit appeler une autre méthode de la classe, il faut faire précéder le nom par self.

Voici donc un exemple de classe écrite en Python pour vous guider pendant votre programmation.

Python

class MaClasse(ClasseDeBase):
# Attributs de classe
un_attribut_de_classe = 'valeur'
def __init__(self, parametre='Valeur par défaut'):
# Initialisation des attributs (variables d'instance)
self.un_attribut = parametre
self.un_autre_attribut = 'autre valeur'
def __str__(self):
return 'Chaîne qui représente l\'objet: %d, %s' % (self.un_attribut, self.un_autre_attribut)
def une_methode(self):
...
def une_autre_methode(self):
...
self.une_methode()
return ...

6.12 Passer un paramètre à un script Python

Il est possible de passer un ou plusieurs paramètres, aussi appelés arguments, à un script Python à partir de la ligne de commande.

Terminal

python3 monscript.py unparametre autreparametre

Pour lire la valeur des paramètres dans le script, il faut d'abord importer le module sys.

Python

import sys

Les paramètres sont contenus dans un tableau nommé sys.argv.

L'élément 0 du tableau est toujours le nom du script.

L'élément 1 est le premier argument, l'élément 2 est le second argument et ainsi de suite.

Python

nom_script = sys.argv[0]
premier_parametre = sys.argv[1]
deuxieme_parametre = sys.argv[2]

Si aucun paramètre n'est passé (paramètre optionnel)

Si le script tente de lire un paramètre alors qu'aucun n'a été passé, le script lèvera une exception de type IndexError.

Il faut donc toujours lire le paramètre dans un try... except.

Lorsqu'aucun paramètre n'est passé, le programme réagira en conséquence. Il pourrait, par exemple, fournir une valeur par défaut.

Python

try:
valeur = sys.argv[1]
except IndexError:
valeur = "x"

Paramètre numérique

À la base, les paramètres sont tous de type texte.

Si le paramètre doit être utilisé comme un nombre, il faut d'abord le convertir.

Python

try:
iterations = int(sys.argv[1])
...
for i in range(iterations):
...

Paramètre numérique optionnel

En combinant les deux approches précédentes, on s'assure que dans le cas d'un paramètre numérique, le programme fonctionne s'il n'est pas passé ou si sa valeur n'est pas numérique.

Python

try:
iterations = int(sys.argv[1])
except IndexError:
iterations = 1 # arrivera ici si aucun paramètre n'est passé
except:
iterations = 1 # arrivera ici si le paramètre n'était pas numérique

Pour plus d'information

« Python Command Line Arguments ». Real Python. https://realpython.com/python-command-line-arguments/#the-sysargv-array

6.13 Forcer l'arrêt d'un script

Quand vous lancez un script, que ce soit un script bash ou un script Python, il pourrait arriver une situation où vous devez en forcer l'arrêt, par exemple si le script entre dans une boucle sans fin.

Ctrl+C

La façon la plus intéressante pour terminer un programme est d'appuyez sur les touches Ctrl+C. Ceci émet un signal SIGINT qui arrête gentiment le programme.

Dans le cas d'un script Python, SIGINT lève une exception de type KeyboardInterrupt qui interrompt le code et qui peut être attrrapée et traitée au même titre que toute autre exception.

Ctrl+Z

Dans le cas où Ctrl+C ne fonctionne pas, on peut se tourner vers une action un peu plus corsée : appuyer sur les touches Ctrl+Z . Ceci émet un signal SIGTSTP qui arrête immédiatement le programme.

Dans les faits, le programme est mis en pause, ce qui peut causer des problèmes, par exemple en ne libérant pas les ports associés au processus.

Dans le cas d'un script Python, SIGTSTP ne laisse pas le temps au script de se terminer normalement.

Il est à noter que certains scripts pourrraient ignorer ce signal.

Tuer le processus

Dans d'autres situations plus complexes, par exemple si le script est lancé par un intermédiaire comme une boîte domotique, alors on n'a pas accès à Ctrl+C ou Ctrl+Z pour l'arrêter. À ce moment, il faut tuer le processus à l'aide de la commande kill ou pkill.

pkill

La commande pkill tue un processus à partir de son nom.

Le plus simple est de lui fournir, à l'aide de -f, le nom du script Python que l'on veut arrêter.

Terminal

sudo pkill -f mon_script.py

Par défaut, pkill envoit un signal SIGKILL qui tue brutalement le processsus sans lui laisser la chance de se terminer de façon gracieuse (libération de la mémoire et tout et tout).

Aucun script ne peut ignorer ce signal.

kill

La commande kill tue un processus à partir de son numéro généré par le système d'exploitation.

Pour faut trouver le numéro du processus qui correspond au script, on peut utiliser la commande ps. On précisera qu'on ne veut voir que les processus dont le nom contient python.

Terminal

ps -ef | grep python

Vous obtiendrez un résultat semblable à cet extrait :

Résultat à l'écran

pi@raspberrypi:~ $ ps -ef | grep python
pi 891 1260 0 11:16 pts/0 00:00:00 python3 clignote.py
pi 1288 1260 0 07:57 pts/0 00:00:00 python3 allume_led.py

La deuxième colonne indique le numéro du processus. Ainsi, pour terminer le script clignote.py, il faut faire :

Terminal

kill -9 891

Il est possible d'utiliser le nom du signal à envoyer plutôt que son numéro :

Terminal

kill -SIGKILL 891

Ces deux commandes envoient un signal SIGKILL qui tue brutalement le processsus sans lui laisser la chance de se terminer de façon gracieuse (libération de la mémoire et tout et tout).

Aucun script ne peut ignorer ce signal.

Remarquez que le même résultat que Ctrl+C peut être obtenu en entrant ceci dans une seconde fenêtre Terminal :

  • kill -2 suivi du numéro de processus

ou * kill -SIGINT suivi du numéro de processus

Pour plus d'information

« Signal (IPC) ». Wikipedia. https://en.wikipedia.org/wiki/Signal_(IPC)

« kill - Envoyer un signal à un processus ». MAN Linux Magique. http://www.man-linux-magique.net/man1/kill.html

« What to do when a Linux desktop freezes? - If all else fails, you Raise The Elephant ». Stack Exchange. https://unix.stackexchange.com/questions/31818/what-to-do-when-a-linux-desktop-freezes#answer-33891

6.14 Erreurs fréquentes

Information à venir...

Pour plus d'information

« Invalid Syntax in Python: Common Reasons for SyntaxError ». Real Python. https://realpython.com/invalid-syntax-python/

6.15 La syntaxe Python vs autres langages

Si vous avez déjà travaillé avec quelques langages de programmation, vous savez que la syntaxe varie d'un langage à l'autre. Parfois, les différences sont minimes mais d'autre fois, elles peuvent être déroutantes.

Pour vous aider à vous acclimater à Python, voici quelques éléments de syntaxe à connaître et leur comparaison avec d'autres langages.

Python JavaScript PHP C#
Chaînes de caractères nom = "Annie" ou nom = 'Annie' Les deux sont équivalents mais les programmeurs préfèrent généralement les apostrophes. Les triples apostrophes ou guillemets permettent de générer une chaîne incluant les sauts de ligne et tabulations. Très utile pour générer du HTML ou du JSON. html = '''    
       
  • Premier élément
  •    
  • Deuxième élément
  •    
''' L'ajout d'un b devant une chaîne transformera cette chaîne en une chaîne d'octets, requis dans certains contextes précis. chaine_octets = b"Bonjour" L'ajout d'un f devant une chaîne permet de la formater. nom = 'Annie' salutation = f'Bonjour, {nom}!'
nom = "Annie"; ou nom = 'Annie'; $nom = "Annie"; ou $nom = 'Annie'; La version avec guillemets permet d'interpréter des variables dans la chaîne. $texte = "Bonjour $nom"; La version avec apostrophes est très légèrement plus rapide. nom = "Annie";
Booléens True False Sensible à la casse true false Sensible à la casse True ou true ou TRUE False ou false ou FALSE Insensible à la casse true false Certaines fonctions C# retournent cependant True ou False... bool valeur = true; Console.WriteLine(valeur); // True
Opérateurs booléens and or not && !
Concaténation nom_complet = prenom + ' ' + nom_famille nomComplet = prenom + ' ' + nomFamille; $nomComplet = $prenom . ' ' . $nomFamille; nomComplet = prenom + '" " + nomFamille;
Incrémentation i += 1 i += 1; (affectation après addition) i++ (opérateur d'incrémentation en suffixe) ++i (opérateur d'incrémentation en préfixe) $i += 1; $i++ (post-incrémente) ++$i (pré-incrémente) i += 1; i++ ++i
Conversion de type nombre= int(saisie) nombre = parseInt(saisie); $nombre = (int)$saisie; ou $nombre = intval($saisie); nombre = Convert.ToInt32(saisie); ou Int32.TryParse(saisie, out nombre);
Affichage à l'écran print(nom) ou, pour éviter les sauts de ligne : print(nom, end='') On peut interpréter des variables dans une chaîne : print(f"Votre score est {score}") L'affichage se fait à l'aide de manipulations du DOM : balise.innerHTML = nom; Si on utilise jQuery : $(balise).html(nom); Pour afficher à la console : console.log(nom); Pour afficher dans une fenêtre popup : window.alert(nom); echo $nom; Dans une page Web : Response.Write(nom); À la console : Console.WriteLine(nom);
Lecture à la console nombre = input('Veuillez entrer un nombre : ') Console.WriteLine("Veuillez entrer un nombre : "); nombre = Console.ReadLine();
Tableaux valeurs = ['a', 'b', 'c'] En Python, on dit que c'est une liste (modifiable, longueur variable) Il existe également des tuples (immuables mais plus performants) : valeurs = ('a', 'b', 'c') ou, s'il y a un seul élément dans le tuple : valeurs = ('a',) var valeurs = ['a', 'b', 'c']; $valeurs = ['a', 'b', 'c']; string[] valeurs = {"a", "b", "c"};
Tableaux associatifs (dictionnaires) configuration = {     'menu': 'gauche',     'langue': 'fr' } ... valeur = configuration['langue'] var configuration = {     'menu' : 'gauche',     'langue': 'fr' }; ... valeur = configuration['langue']; $configuration = [     'menu' => 'gauche',     'langue' => 'fr', ]; ... $valeur = $configuration['langue'] Dictionary configuration = new Dictionary() {     {"menu","gauche"},     {"langue", "fr"} }; ... valeur = configuration["langue"];
Vérifier si une valeur fait partie d'une liste de valeurs if i in (3, 6, 9):     ...
Conditions if nom == 'Annie':     ... elif nom == 'Toto':     ... else:     ... Note : l'indentation (4 espaces) est importante : c'est elle qui indique quand un bloc d'instruction se termine. if (nom == 'Annie') {     ... } else if (nom == 'Toto') {     ... } else {     ... } if ($nom == 'Annie') {     ... } elseif ($nom == 'Toto') {     ... } else {     ... } if (nom == "Annie) {     ... } else if (nom == "Toto") {     ... } else {     ... }
Boucles while while x < 10:     ... while (x < 10) while (x < 10) while (x < 10)
Boucles sur un nombre déterminé d'itérations for i in range(10):     ... La boucle pourrait commencer à une autre valeur que 0, il est possible de spécifier le départ, la fin (exclue de la boucle) et la valeur du saut : for i in range(1, 10, 1)     ... for (i = 0; i < 10; i++) for ($i = 0; $i < 10; $i++) for (i = 0; i < 10; i++)
Boucles sur les éléments d'un tableau valeurs = ['a', 'b', 'c'] for valeur in valeurs:     ... var valeurs = ['a', 'b', 'c']; for (var valeur in valeurs) $valeurs = ['a', 'b', 'c']; foreach ($valeurs as $valeur) string[] valeurs = {"a", "b", "c"}; foreach (int valeur in valeurs) {     ... }
Opérateur ternaire (inline if) valeur_si_vrai if condition else valeur_si_faux Remarquez que l'ordre des opérandes est différent des autres langages. Ex : majeur = True if age >= 18 else False condition ? valeurSiVrai : valeurSiFaux condition ? valeurSiVrai : valeurSiFaux condition ? valeurSiVrai : valeurSiFaux
Exceptions try:     ... except TypeException as e:     ... # traitement d'une exception précise except Exception as e:     ... # traitement des autres exceptions else:     ... # traitement si pas d'exception finally:     ... # traitement si exception ou non try {     ... } catch (e) {     if (e instanceof TypeException) {         ... // traitement d'une exception précise     } else {         ... // traitement des autres exceptions     } } finally {     ... // traitement si exception ou non } try {     ... } catch (TypeException $e) {     ... // traitement d'une exception précise } catch (Throwable $e) {     ... // traitement des autres exceptions si PHP 7 } catch (Exception $e) {     ... // traitement des autres exceptions si PHP 5.X } finally {     ... // traitement si exception ou non } try {     ... } catch (TypeException) {     ... // traitement d'une exception précise } catch (Exception e) {     ... // traitement des autres exceptions } finally {     ... // traitement si exception ou non }
Commentaires # // /* ... */ # // /* ... */ // /* ... */
Commentaires de documentation Cette documentation d'appelle Docstring. def ma_fonction(parametre):     """Résumé de la fonction sous forme impérative.     Autres paragraphes pour documenter les paramètres et la valeur de retour.     """     ... Description" _wzxhzdk:88_Description="Description" class=".." de="de" du="du" fonction._wzxhzdk:85_="fonction." la="la" paramètre._wzxhzdk:87_="paramètre." retour._wzxhzdk:89_="retour." valeur="valeur">function maFonction(parametre) Cette documentation s'appelle phpDocumentor. /**  * Résumé de la fonction.  *  * @param int $parametre Description du paramètre.  *  * @author Annie Gagnon anniegagnon@gmail.com  * @return int Description de la valeur de retour.  *  */ function maFonction(int $parametre) : int /// /// Résumé de la fonction. /// /// Description du paramètre. /// Description de la valeur de retour. int MaFonction(int parametre)
Constante pour changement de ligne qui vaudra '\n' (systèmes Unix comme Linux et Mac) ou '\r\n' (Windows) os.linesep PHP_EOL Environment.NewLine
Valeur nulle variable = None let variable = null; $variable = NULL; string variable = null;
Python JavaScript PHP C#

Pour compléter ce tableau, voici quelques normes de programmation généralement appliquées dans différents langages.

Python JavaScript PHP C#
Projets Il n'y a pas de convention officielle pour le nom du projet. Voici ce que je vous suggère : touteenminuscules ou casse_serpent Sous PyCharm, puisque l'environnement de développenent est copié pour chacun des projets, je vous suggère de regrouper dans un même projet tous vos exercices qui utilisent une même base de données. Ceux qui n'utilisent aucune BD pourront être placés par exemple dans un projet console_sans_bd et dans un autre projet graphique_sans_bd.
Espaces de noms toutenminuscules
Fichiers toutenminuscules ou casse_serpent toutenminuscules ou minuscules-avec-traits-d-union Dépend du framework utilisé
Noms de variables casse_serpent casseChameau Le guide officiel précise qu'aucune recommandation n'est faite pour le nom des variables. Cependant, la casseChameau est la plus utilisée. Les variables débutent obligatoirement par un $. casseChameau
Noms de classes CassePascal CassePascal CassePascal CassePascal
Noms de fonctions casse_serpent casseChameau casseChameau CassePascal
Noms de constantes MAJUSCULES_AVEC_CASSE_SERPENT MAJUSCULES_AVEC_CASSE_SERPENT MAJUSCULES_AVEC_CASSE_SERPENT CassePascal
Python JavaScript PHP C#

Pour plus d'information

« Python 3.6.4 documentation ». Python. https://docs.python.org/3.6/index.html

« Learning Python: From Zero to Hero ». Medium. https://medium.freecodecamp.org/learning-python-from-zero-to-hero-120ea540b567

« PEP 8 -- Style Guide for Python Code ». Python. https://www.python.org/dev/peps/pep-0008/

« PEP257: Good Python docstrings by example ». Dolph Mathews. http://blog.dolphm.com/pep257-good-python-docstrings-by-example/