Ce document est construit en réponse à certaines de vos questions. Nous essayons de le mettre à jour au plus vite. N'hésitez pas à consulter les forums (discussions) qui répondront sans doute à la plupart de vos questions, et où si vous ne trouver pas de réponse vous pouvez poser de nouvelles questions.
---
Utilisation de PyCharm
Vous avez installé et créé un projet dans PyCharm, voyons comment créer et exécuter un script
Un projet peut contenir plusieurs scripts bien sûr. Soit qui sont liés (c'est le cas dans les gros projets réels) soit qui sont indépendants mais appartiennent à une même famille... c'est le cas par exemple si je décide de faire un projet par Module de mon MOOC : je mettrai dans le projet Module_1 tous mes exercices du module 1 etc. On peut aussi faire un gros projet MOOC_Python et mettre tous ses scripts dedans.
Cette organisation est bien sûr question de goût, d'habitude de travail et donc propre à chacun.
Lorsque votre projet est créé, pour y ajouter un nouveau script vous pouvez utiliser un clic droit sur le nom du projet, dans la colonne de gauche et faire New
> Python File.
Vous donnez un nom à ce script qui vient se rajouter aux autres. Dans la colonne de gauche vous avez l'ensemble des scripts. Ainsi, les deux captures suivantes montrent comment j'ai créé un nouveau script nommé test_2.py.


Parmi tous les scripts de votre projet, pour en exécuter un, il y a deux cas de figure :
- soit il est sélectionné comme script courant (il apparaît en haut à droite avec la petite flèche verte) auquel cas utiliser cette petite flèche ou faire
Run
dans le menu exécutera ce script.
- Soit il ne l'est pas et alors le plus simple est de faire, dans la colonne de gauche, un clic droit sur le nom du script que vous voulez exécuter (disons
test_2.py
) et choisir dans le menu contextuel Run test_2

Et les scratch file ?
Les scratch filessont des fichiers python comme les autres mais numérotés automatiquement et rangés dans un dossier (projet) à part. Par exemple ci-dessous j'ai créé un nouveau scratch file, (ce n'est pas mon premier comme l'atteste le 2 dans le nom) et il n'apparaît pas dans mon Projet (qu'on voit à gauche). Mais si je fais apparaître le menu contextuel en cliquant-droit sur le nom scratch_2.py
, je vois que j'ai un Run scratch_2
et je peux donc l'éxecuter. Néanmoins, je vous conseille de plutôt créer des fichiers python dans votre ou vos projets et de ne pas utiliser les scratch files de peur de ne plus savoir où se trouvent vos codes.

---
Problème d'accès à UpyLaB
Avant tout, il est toujours prudent que vous conserviez vos codes des exercices UpyLaB, pour éviter les pertes éventuelles (soyons toujours prudent).
Plusieurs d'entre vous ont eu des soucis d'accès à UpyLaB (Cela reste bloqué à "Connexion en cours ... "
, ou "test en cours"
) surtout le soir en période de forte utilisation. Nous essayons d'améliorer l'outil pour supprimer ce soucis.
En attendant, si cela arrive, voici comment essayer de résoudre ce problème :
Le soucis peut être lié soit à une surcharge temporaire d'UpyLaB : réessayez un peu plus tard et en attendant de pouvoir les valider, faites vos exercices localement (Enoncés accessibles ici Modules 1 à 4)
Ensuite, sauvez votre code en le copiant (copy) ensuite cliquez sur le bouton "Vérifier"
éventuellement 2 ou 3 fois et voir si cela résout le problème.
Vous pouvez alors éventuellement remettre votre code et continuer.
Sinon, si vous débutez avec ce MOOC et UpyLaB, le soucis est peut-être lié à votre navigateur, à sa configuration ou une extension comme ghostery qui bloque les interactions avec UpyLaB.
Des soucis ont été évoqués avec les navigateurs: Safari, Firefox, Chromium.et Microsoft Edge
Dans ce cas, voici des conseils trouvés dans le forum:
- j'ai eu le soucis sous safari, je suis donc passée à Google Chrome et tout fonctionne bien maintenant
- J'utilise le plugin "noscript" avec Firefox, il faut faire attention à autoriser les domaines fun-mooc.fr ET ulb.ac.be, sinon, on a également le message "Connexion en cours ..." de manière permanente.
- J'utilise également Firefox (à jour) agrémenté de NoScript et ABP. J'ai rencontré le problème de connexion à UpyLaB et l'ai résolu en cliquant à gauche de la barre d'url (icône bouclier / cadenas) puis en sélectionnant "Désactiver le blocage".
- J'utilise firefox avec un bloqueur, et il est exact qu'avec un bloqueur de pub cela ne fonctionne pas correctement.
- Il faut en effet que le navigateur accepte les pop-ups
- Pour les utilisateurs de Firefox paramétré pour bloquer les cookies tiers, il faut aller dans ajouter une exception pour autoriser https://upylab.ulb.ac.be. Préférences - Vie privée et sécurité - Gérer les permissions - mettre https://upylab.ulb.ac.be dans le champs Adresse du site web
- Autoriser - Enregistrer les modifications. Recharger la page et upylab juste marche :-) Cette solution fonctionne sous Chromium,
- Si vous utilisez ghostery, il faut mettre "site de confiance" pour que cela fonctionne.
----
UpyLaB me dit que mon code est faux !
Voici quelques astuces pour déboguer votre code.
Supposons qu'UpyLaB vous demande d'écrire n caractères '+' sur une ligne après avoir lu l'input n
et que votre code soit
n = int(input())
print('+'*n)
print() # ici j'imprime malheureusement une ligne de trop !
Comment faire pour voir l'erreur.
Utilisez Python Tutor
Premier conseil : si votre code ne contient pas de module comme turtle..., utilisez Python Tutor comme expliqué en section 1.5 en cliquant sur le texte "Visualize your code and get live help now" et en explicitant que le code est écrit en python 3.6.
UpyLaB me dit Le code comprend des erreurs: Ligne 15: Erreur de syntaxe
- Mais la ligne 15 et 14 sont parfaitement syntaxiquement correctes ou pire, mon code fait moins de 15 lignes. Des lignes sont parfois ajoutées à votre code pour permettre à UpyLaB de le tester. Donc votre erreur est peut-être quelques lignes avant.
- Attention aussi à la version de Python utilisée par UpyLaB : pour la session février-mars 2019 : Python 3.5.3 qui ne permet pas encore les f-strings introduit avec Python 3.6.
UpyLaB me donne le message:
Erreur serveur: Votre programme a planté ou a duré trop longtemps. Vérifiez que vos boucles terminent.
L'exécution de votre fonction cycle probablement, comme l'exécution de celle-ci :
def ma_fonction_qui_cycle(n):
while True:
pass
UpyLaB me dit le message : Ligne 13 "EOF" when reading a line
Si vous recevez d'UpyLaB le message "EOF when reading a line", cela signifie que UpyLaB a testé votre code et que ce dernier demande un input quand en fait UpyLaB a donné tout ce qu'il devait.
EOF signifie "end of file" : ici plus de données fournie en input
Donc votre code fait un input()
en trop
Attention, comme des lignes de code sont ajoutées par l'outil UpyLaB pour tester votre code, l'input() n'est souvent pas à la ligne mentionnée mais plutôt quelques lignes avant (n'oubliez pas qu'UpyLaB n'est pas un outil de débogage; il ne fait que valider si votre code est conforme à ce qui est requis).
Autre astuce si mon code imprime semble imprimé le texte demandé
Si vous voulez deboguer votre code dans PyCharm (ou UpyLaB), une astuce est d'ajouter à chaque print
un caractère particulier pour voir où est la fin de la ligne
Ici :
n = int(input())
print('+'*n + '€') # ajoute un caractère '€' en fin de ligne
print('€') # idem
ou mieux, en utilisant l'argument end
du print
n = int(input())
print('+'*n, end = "€\n") # ajoute un caractère '€' en fin de ligne
# suivi du passage à la ligne
print(end = "€\n") # imprime juste le paramètre end
Le résultat de l'exécution avec n valant 5 sont les deux lignes
+++++€
€
ce qui met en évidence que votre code a une ligne en trop !
Après avoir corrigé, enlevez les '€' et tester votre code sur UpyLaB.
Puis-je mettre mon code dans le forum ?
Non. Comme précisé dans les règles du forum, il ne faut pas mettre de code dans vos messages. Pour pouvez décrire précisément les erreurs renvoyées par UpyLaB et même mettre des captures d'écran de ces messages.
---
SyntaxError dans mon code
Si vous avez un message syntax error dans PyCharm qui indique par exemple la ligne suivante :
print(long*sin(pi/3), long*cos(pi/3))
^
SyntaxError: invalid syntax
en fait l'erreur se situe généralement à la ligne ou l'instruction précédente.
Vérifiez donc par exemple vos parenthèses, ...
Ici j'avais par exemple comme code:
from math import pi, cos, sin
long = float (input())
print(long, 0.0
print(long*cos(pi/3), long*sin(pi/3))
et c'est la parenthèse manquante du premier print qui a créé l'erreur.
---
Pourquoi UpyLaB valide le code complet mais pas ma fonction !
Dans les exercices UpyLab 4.1 à 4.4, nous vous demandons la définition de fonctions ET le code qui appelle cette fonction et imprime des résultats.
Certains d'entre vous peuvent avoir le code complet validé par UpyLaB mais pas le test UpyLaB sur la fonction elle même.
Le soucis probable est que vous n'avez pas bien appliqué le mécanisme de passage de paramètres.
Dans ce cas, nous vous invitons à bien voir ou revoir la matière sur les fonctions et en particulier la notion de paramètres formels, paramètres effectifs et la transmission de l'un à l'autre lors de l'appel.
Dans les exercices UpyLaB 4.1 à 4.4, le code de vos fonctions ne doit rien utiliser d'autre que leurs paramètres formels et les variables locales qui y sont définies !
---
Les math ne sont pas ma tasse de thé !
Même s'il vaut mieux tout suivre, certaines parties qui vous semblent trop mathématiques peuvent être ignorées. Par exemple :
Comme annoncé, le projet sera basé sur la création de tableaux d'opt-art appelée aussi art-géométrique (voir l'oeuvre de Vasarely).
Si vous comptez faire ce projet, effectivement l'exercice 2.5 par exemple est important, car cela constituera une partie du programme à écrire.
Libre aussi à vous de passer certaines parties et d'y revenir plus tard si vous changez d'avis (vérifiez dans le calendrier en section 1.2, les dates butoirs pour avoir terminé les exercices UpyLaB et les quiz).
En tout cas, il serait dommage que les mathématiques de ce cours soit une raison pour vous d'arrêter.
Notre équipe mais aussi la communauté essaye toujours de répondre à vos questions !
Bonne continuation
---
Algorithme avant codage
Plusieurs posts dans les forums font état de : "je ne comprends pas bien ce qu'il faut faire", "ma boucle ne termine pas"... Parfois il s'agit d'une petite erreur de syntaxe. Mais à d'autres moments c'est une erreur de conception même qui empêche l'avancée. Ci-dessous sur l'exemple du jeu de devinette, un canevas d'analyse descendante :
- Initialisation de mes données : de quoi j'ai besoin ? quels types ? (on pourra bien sûr revenir sur cette partie si on se rend compte d'un besoin supplémentaire)
- Le principe général du jeu est : je demande à l'utilisateur un nombre, j'analyse ce nombre je donne une indication... et je recommence, ... quand est-ce que je m'arrête au fait ? Quand il a trouvé ou quand il n'a plus d'essais. Donc Je continue à lui demander tant que (while en anglais) il n'a pas trouvé et qu'il reste des essais (on retrouve De Morgan là)... ce qui me donne ma boucle principale :
Tant que proprosition ≠ secret et nb_essais > 0 Alors
je demande une proposition
je mets à jour le nombre d'essais
j'analyse cette proposition et j'affiche les messages d'aide
Je suis sorti de ma boucle, j'affiche le résultat
Et je recommence mon travail d'analyse pour chacun des items de ma boucle... jusqu'à ce que la traduction en une instruction soit simple. Par exemple "je mets à jour le nombre d'essais" se traduira immédiatement par un nb_essais = nb_essais - 1
Cette analyse vous ne la trouverez probablement pas du premier jet. Il faudra manipuler des instances du problèmes, verbaliser, modéliser... recommencer. Et oui, la programmation se fait d'abord avec du papier et un crayon ;-)
---
Une Turtle en paramètre des fonctions ?!
Certains sont perturbés par la présence d'une tortue comme paramètre de fonctions à définir. Normalement, on utilise le module turtle en créant un objet Turtle (notez la majuscule)... comme ceci :
import turtle
def ma_fun(t, pt_a):
"""
ma tortue t avance au point pt_a
"""
t.goto(pt_a)
ma_tortue = turtle.Turtle()
ma_tortue.speed(0)
ma_fun(ma_tortue, (100, 100))
ma_tortue.screen.mainloop()
Car bien sûr on pourra dans une application plus complexe, utiliser plusieurs tortues, associées à de la programmation parallèle etc.
Mais pour une initiation, cela rajoute trop de choses (comme le fait que l'objet Turtle ne possède pas la méthode mainloop() mais c'est l'objet screen de l'objet Turtle...) Du coup une version simplifiée est :
import turtle
def ma_fun(t, pt_a):
"""
ma tortue t avance au point pt_a
"""
t.goto(a)
turtle.speed(0)
ma_fun(turtle, (100, 100))
turtle.mainloop()
En utilisant dans le programme non plus un objet Turtle explicitement créé, mais le nom même du module, on laisse à Python le soin de manipuler une tortue par défaut et d'appliquer les méthodes aux bons objets (`turtle.speed()` et `turtle.goto()` s'appliquent bien à un objet Turtle alors que `turtle.mainloop()` va aller chercher le screen associé à la tortue par défaut... )
Et une version encore plus simplifiée pourrait ne pas mettre de paramètre tortue dans la fonction ma_fun :
import turtle
def ma_fun(pt_a):
"""
la tortue par défaut avance au point pt_a
"""
turtle.goto(pt_a)
turtle.speed(0)
ma_fun((100,100))
turtle.mainloop()
Mais dans le projet nous avons décidé de laisser la tortue comme 1er argument de la fonction pavage. En espérant avoir clarifié les choses.