Valid XHTML     Valid CSS2    

Listing du fichier tp2.php

 

00001     <?php
00002     
# # (gH) -_- tp2.php ; TimeStamp (unix) : 24 Juin 2018 vers 20:53
00003     
error_reporting(E_ALL | E_NOTICE | E_STRICT ) ;
00004     
header
('Content-Type "text/html; charset=iso-8859-1"') ;
00005     
ini_set
( 'default_charset', 'ISO-8859-1' );
00006     include(
"decra-inc.php") ;
00007     
00008     
$numSerie
= 2 ;
00009     
debutTP
($numSerie,"Programmation en Python") ;
00010     
ghAtAngers() ;
00011     
00012     
$R
= ghRouge("R") ;
00013     
$XML
= ghRouge("XML") ;
00014     
$Awk
= ghRouge("AWK") ;
00015     
$Php
= ghVert("PHP") ;
00016     
$Python
= ghBleu("Python") ;
00017     
00018     
## -------------------------------------------------------------------------------------------
00019     
00020     
sdl
(3) ; echo cmt(' pour afficher toutes les solutions : tp2.php?solutions=1') ; sdl(3) ;
00021     
00022     
## -------------------------------------------------------------------------------------------
00023     
00024     
pvide() ;
00025     
00026     
debutSection() ;
00027     
00028     
$tableauDesRubriques = array() ;
00029     
$idr
= 0 ;
00030     
$idr
++; $tableauDesRubriques[$idr] = "Vérification du tuteur $Python" ;
00031     
$idr
++; $tableauDesRubriques[$idr] = "Réindentation de code $Python" ;
00032     
$idr
++; $tableauDesRubriques[$idr] = "Compréhension de code $Python" ;
00033     
$idr
++; $tableauDesRubriques[$idr] = "Modes de développement et d'exécution en $Python" ;
00034     
$idr
++; $tableauDesRubriques[$idr] = "Archivage incrémental" ;
00035     
$idr
++; $tableauDesRubriques[$idr] = "Utilisation d'un Jupyter notebook pour $Python" ;
00036     
$idr
++; $tableauDesRubriques[$idr] = "Scripts $Python avec un argument en ligne de commande" ;
00037     
$tdmCRLM
= new tdm($tableauDesRubriques) ;
00038     
$tdmCRLM
->titre() ;
00039     
$tdmCRLM
->menu("oui","oui","nou") ;
00040     
00041     
direAfficherSolutionsTP
($numSerie) ;
00042     
00043     
p
("texte") ;
00044     echo
ghRouge
("Remarque&nbsp;:") ;
00045     echo
" sauf pour les exercices 3 et 6, les exercices sont à réaliser dans un terminal, à l'aide de l'interpréteur " ;
00046     echo
" indiqué, à savoir "
.b("python3")." ou ".b("ipython3")."." ;
00047     
finp() ;
00048     
00049     
p
("texte") ;
00050     echo
" Utiliser un répertoire pour tous vos développements de ce T.P., par exemple nommé " ;
00051     echo
b
("tp2/")." ou ".b("DCRA-tp2/")." est une pratique conseillée. Dans les salles du département informatique, le chemin absolu pour les notebooks, " ;
00052     echo
" quant à lui, est "
.b("/media/D/Mes_notebooks/").". " ;
00053     
finp() ;
00054     
00055     
finSection() ;
00056     
00057     
$numExo
= 0 ;
00058     
00059     
## -------------------------------------------------------------------------------------------
00060     
00061     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Vérification du tuteur Python
00062     
00063     ## -------------------------------------------------------------------------------------------
00064     
00065     
blockquote
() ; # tp
00066     
00067     
blockquote
() ; # énoncé
00068     
00069     
p
("texte") ;
00070     echo
" Lire le "
.href("../tuteurs/tutpython.php","tuteur Python") ;
00071     echo
" et essayer de vérifier que chaque code
$Python fourni est correct à l'aide la commande ".b("python3&nbsp;script.py")." où " ;
00072     echo
b
("script.py")." est le nom du fichier qui contient le code." ;
00073     
finp() ;
00074     
00075     
p
("texte") ;
00076     echo
" Lorsque le nom du fichier python est donné, " ;
00077     echo
" il faut le télécharger à l'aide de la commande "
.href("https://doc.ubuntu-fr.org/wget","wget")." car " ;
00078     echo
" sinon, par copier/coller, on risque de perdre l'indentation qui est très stricte en
$Python." ;
00079     echo
" On supprimera le code "
.b("#&nbsp;-*-&nbsp;coding:latin1&nbsp;-*-")." " ;
00080     echo
" si un fichier commence par une telle ent&ecirc;te et on adaptera le code en conséquence." ;
00081     
finp() ;
00082     
00083     
p
("texte") ;
00084     echo
" On commencera par vérifier la version de
$Python utilisée." ;
00085     
finp() ;
00086     
00087     
p
("texte") ;
00088     echo
b
(em("Remarque&nbsp;:")) ;
00089     echo
" on pourra utiliser "
.b("geany")." comme éditeur de code $Python." ;
00090     
finp() ;
00091     
00092     
h3
(ghVert("Quelques questions à propos des exemples du tuteur&nbsp;:")) ;
00093     
00094     
ul() ;
00095     
00096     
debutli
() ; p("texte") ;
00097      echo
" Est-ce que les exemples "
.b("bonjour.py").", ".b("if2.py")." , ".b("if3.py")." , " ;
00098      echo
" "
.b("python_demo5.py")." et ".b("python_demo6.py") ;
00099      echo
" fonctionnent tels quels dans les salles informatiques de l'université ou sur votre ordinateur (si vous &ecirc;tes en distanciel)&nbsp;?" ;
00100      echo
" Si non, que faut-il installer et comment, sachant qu'on n'a pas le droit " ;
00101      echo
" d'&ecirc;tre "
.b("administrateur")." (".em("root").") sur ces ordinateurs&nbsp;?" ;
00102     
finp
() ; finli() ;
00103     
00104     
debutli
() ; p("texte") ;
00105      echo
" Est-ce que les exemples "
.b("tdmv1.py")." et ".b("tdmv2.py")." (qui utilisent ".b("easygui.py").") " ;
00106      echo
" fonctionnent tels quels dans les salles informatiques de l'université ou sur votre ordinateur&nbsp;?" ;
00107      echo
" Si non, que faut-il installer et comment, sachant qu'on n'a pas le droit " ;
00108      echo
" d'&ecirc;tre "
.b("administrateur")." (".em("root").") sur ces ordinateurs&nbsp;?" ;
00109     
finp
() ; finli() ;
00110     
00111     
debutli
() ; p("texte") ;
00112      echo
" Est-il possible de tester l'exemple de la section 4 qui utilise le module "
.b("pymysql")."&nbsp;?" ;
00113      echo
" et le script "
.b("getndjpm.py")."&nbsp;?" ;
00114      echo
" et les autres scripts de cette section 4&nbsp;?" ;
00115     
finp
() ; finli() ;
00116     
00117     
debutli
() ; p("texte") ;
00118      echo
" Est-ce que les exemples qui utilisent
$XML fonctionnent dans les salles du département informatique de l'université d'Angers ou sur votre ordinateur&nbsp;?" ;
00119     
finp
() ; finli() ;
00120     
00121     
finul() ;
00122     
00123     
finblockquote
() ; # énoncé
00124     
00125     
solutionTP
($numExo,$numSerie) ;
00126     
00127     
p
("texte") ;
00128      echo
" Tous les exemples fonctionnaient (bien s&ucirc;r) avec Python 3.2 à l'époque où le tuteur
$Python a été écrit. " ;
00129      echo
" Avec une version récente (Python 3.7, juin 2018) tous les exemples fonctionnent encore. " ;
00130     
finp() ;
00131     
00132     
p
("texte") ;
00133     echo
" Au premier octobre 2018, dans les salles du département informatique de l'université d'Angers, il y a " ;
00134     echo
" deux versions de
$Python qui coexistent. On fera donc bien attention à utiliser la commande " ;
00135     echo
b
("python3")." pour exécuter les scripts. C'est peut-&ecirc;tre aussi le cas pour vos ordinateurs." ;
00136     
finp() ;
00137     
00138     
pre_fichier
("versionsAlafac.txt","cadrejaune") ;
00139     
00140     
p
("texte") ;
00141     echo
"Si vous voulez ne pas vous tromper, le plus simple est de créer un alias python qui exécute python3, " ;
00142     echo
" un alias ipython qui exécute ipython3 " ;
00143     echo
" et un alias pip exécute pip3 comme suit&nbsp;:" ;
00144     
finp() ;
00145     
00146     
pre_fichier
("py-alias.txt","cadre") ;
00147     
00148     
p
("texte") ;
00149      echo
" Suivant les années, le module "
.b("easygui.py")." est ou n'est pas installé dans les " ;
00150      echo
" salles informatiques de l'université. En tant qu'utilisateur, il est possible d'installer un module avec " ;
00151      echo
" la commande "
.href("https://pip.pypa.io/en/stable/user_guide/","pip3").". " ;
00152      echo
" La m&ecirc;me remarque s'applique aux autres modules utilisés dans le tuteur, comme par exemple " ;
00153      echo
href
("https://pymysql.readthedocs.io/en/latest/","easygui").". " ;
00154     
finp() ;
00155     
00156     
p
("texte") ;
00157      echo
" Si vous n'avez jamais utilisé "
.b("pip")." ou ".b("pip3").", voici deux liens intéressants, " ;
00158      echo
href
("http://apprendre-python.com/page-pip-installer-librairies-automatiquement","ici") ;
00159      echo
" et "
.href("https://www.dabapps.com/blog/introduction-to-pip-and-virtualenv-python/","là").". " ;
00160      echo
" Le deuxième lien, en anglais, explique aussi ce qu'est "
.b("virtualenv")."." ;
00161     
finp() ;
00162     
00163     
p
("texte") ;
00164     echo
" Les fichiers suivants ont le comportement attendu&nbsp;: " ;
00165     echo
href
("bonjour.py").", " ;
00166     echo
href
("if2.py").", " ;
00167     echo
href
("if3.py").", " ;
00168     echo
href
("tdmv1.py").", " ;
00169     echo
href
("python_demo5.py").", " ;
00170     echo
href
("python_demo6.py")." et " ;
00171     echo
href
("serveurweb.py").". " ;
00172     
finp() ;
00173     
00174     
p
("texte") ;
00175     echo
" Pour "
.href("tdmv2.py")." il faut exécuter en ligne de commandes ".b("pip3&nbsp;install&nbsp;easygui")." pour que le script fonctionne." ;
00176     
finp() ;
00177     
00178     
p
("texte") ;
00179     echo
" Dans les salles du département informatique, il n'est sans doute pas possible d'installer "
.b("pymysql")." avec la commande ".b("pip3&nbsp;pymysql")." " ;
00180     echo
" donc le script associé ne fonctionne pas." ;
00181     
finp() ;
00182     
00183     
p
("texte") ;
00184     echo
" Dans les salles du département informatique, le script "
.href("getndjpm.py")." ne fonctionne pas." ;
00185     echo
" Par contre, le script "
.href("serveurweb.py")." fonctionne. On s'en rend compte en ouvrant un navigateur à " ;
00186     echo
" l'adresse "
.href("http://localhost:8090").". Dans le terminal qui a lancé le script, il faut faire ".b("Control-C")." pour arr&ecirc;ter ce serveur. " ;
00187     
finp() ;
00188     
00189     
p
("texte") ;
00190     echo
" Un script fonctionnel équivalent à "
.href("getndjpm.py") ;
00191     echo
" est "
.href("getndjpm2.py").", m&ecirc;me s'il faut (peut-&ecirc;tre) installer le module ".b("requests").". " ;
00192     
finp() ;
00193     
00194     
p
("texte") ;
00195     echo
" Le script qui exécute la transformation "
.b("XSL")." nommée ".href("vide.xsl") ;
00196     echo
" sur le fichier
$XML nommé ".href("test3.xml") ;
00197     echo
" fonctionne aussi." ;
00198     
finp() ;
00199     
00200     
finsolution
() ; # contient un blockquote
00201     
00202     
finblockquote
() ; # tp
00203     
00204     ## -------------------------------------------------------------------------------------------
00205     
00206     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Réindentation de code Python
00207     
00208     ## -------------------------------------------------------------------------------------------
00209     
00210     
blockquote
() ; # tp
00211     
00212     
blockquote
() ; # énoncé
00213     
00214     
p
("texte") ;
00215     echo
"
$Python est un des rares langages à imposer une indentation stricte pour les blocs. Ainsi le programme " ;
00216     echo
href
("malindent.py")." ci-dessous n'est pas exécutable. Réindenter son code pour qu'il s'exécute " ;
00217     echo
" correctement. On devra obtenir comme résultat d'exécution du fichier correct le fichier "
.href("bienindent_res.txt")."." ;
00218     
finp() ;
00219     
00220     
p
("texte") ;
00221     echo
"Au passage, que réalise ce script
$Python&nbsp;?" ;
00222     
finp() ;
00223     
00224     
pre_fichier
("malindent.py","cadrebleu") ;
00225     
00226     
p
("texte") ;
00227     echo
"Réindenter aussi " ;
00228     echo
href
("mini_mvc2_py.txt")." et " ;
00229     echo
href
("mini_mvc3_py.txt")." " ;
00230     echo
" avant de vérifier que ces programmes s'exécutent en Python 2. Les convertir ensuite en Python 3." ;
00231     echo
" Que peut-on en déduire sur MVC&nbsp;?" ;
00232     
finp() ;
00233     
00234     
pre_fichier
("mini_mvc2_py.txt","cadrejaune") ;
00235     
pre_fichier
("mini_mvc3_py.txt","cadrebleu") ;
00236     
00237     
finblockquote
() ; # énoncé
00238     
00239     
solutionTP
($numExo,$numSerie) ; # contient un blockquote
00240     
00241     # consulter("bienindent.py") ;
00242     
00243     
p
("texte") ;
00244     echo
"Les textes correctement indentés sont nommés respectivement " ;
00245     echo
href
("bienindent.py").", " ;
00246     echo
href
("mini_mvc1.py").", " ;
00247     echo
href
("mini_mvc2.py")." et " ;
00248     echo
href
("mini_mvc3.py")."." ;
00249     echo
" Comme indiqué, ils ne fonctionnent qu'avec Python 2." ;
00250     
finp() ;
00251     
00252     
p
("texte") ;
00253     echo
"Pour Python 3, voir " ;
00254     echo
href
("mini_mvc1.py3").", " ;
00255     echo
href
("mini_mvc2.py3")." et " ;
00256     echo
href
("mini_mvc3.py3").". " ;
00257     echo
"En cas de problème d'installation, utiliser apt-get pour installer python3-tk et importer ensuite tk au lieu de Tk (donc sans majuscule sur le t) " ;
00258     echo
" dans le code-source. " ;
00259     echo
" Il y a un programme nommé " ;
00260     echo
href
("http://docs.python.org/3.3/library/2to3.html","2to3") ;
00261     echo
" qui fait partie de la distribution de Python dont le but est " ;
00262     echo
" d'essayer de convertir automatiquement de Python 2 vers Python 3." ;
00263     
finp() ;
00264     
00265     
p
("texte") ;
00266     echo
" Ces scripts implémentent en programmation objets des mini-exemples de MVC afin de bien en présenter les concepts." ;
00267     
finp() ;
00268     
00269     
finsolution
() ; # contient un blockquote
00270     
00271     
finblockquote
() ; # tp
00272     
00273     ## -------------------------------------------------------------------------------------------
00274     
00275     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Compréhension de code Python
00276     
00277     ## -------------------------------------------------------------------------------------------
00278     
00279     
blockquote
() ; # tp
00280     
00281     
blockquote
() ; # énoncé
00282     
00283     
p
("texte") ;
00284     echo
" L'une des forces du langage
$Python est de permettre l'écriture de code en mode " ;
00285     echo
href
("https://fr.wikipedia.org/wiki/Lambda-calcul","lambda-calcul").". " ;
00286     
finp() ;
00287     
00288     
p
("texte") ;
00289     echo
" Corriger le code " ;
00290     echo
href
("obfus-1.py")." ci-dessous qui n'est pas exécutable à cause d'erreur(s) simple(s) de syntaxe. " ;
00291     echo
" Qu'affiche-t-il alors&nbsp;?" ;
00292     echo
" Au passage, est-ce du Python&nbsp;2 ou du Python&nbsp;3&nbsp;?" ;
00293     echo
" Si c'est du Python&nbsp;2, donner la version Python&nbsp;3 correspondante." ;
00294     
finp() ;
00295     
00296     
pre_fichier
("obfus-1.py","cadrebleu") ;
00297     
00298     
p
("texte") ;
00299     echo
" Si le style " ;
00300     echo
href
("https://en.wikipedia.org/wiki/One-liner_program","one-liner")." vous perturbe, voici une version indentée, tout aussi " ;
00301     echo
b
("absconse").", à la limite de l'" ;
00302     echo
href
("https://en.wikipedia.org/wiki/Obfuscation_(software)","obfuscated")."&nbsp;:" ;
00303     
finp() ;
00304     
00305     
pre_fichier
("obfus-2.py","cadrejaune") ;
00306     
00307     
p
("texte") ;
00308     echo
" Que peut-on penser de cette façon de programmer&nbsp;?" ;
00309     
finp() ;
00310     
00311     
finblockquote
() ; # énoncé
00312     
00313     
solutionTP
($numExo,$numSerie) ; # contient un blockquote
00314     
00315     
p
("texte") ;
00316     echo
" Tout d'abord, il s'agit de code Python&nbsp;2 car il y a écrit "
.b("print&nbsp;x").". " ;
00317     echo
" En Python3 ce serait "
.b("print(x)")." donc avec des parenthèses." ; ;
00318     
finp() ;
00319     
00320     
p
("texte") ;
00321     echo
" L'erreur se situe au niveau de l'appel de la fonction puissance. " ;
00322     echo
" Il faut corriger "
.ghRouge("pow(y;0,5)") ;
00323     echo
" en "
.ghVert("pow(y,0.5)").". " ;
00324     
finp() ;
00325     
00326     
p
("texte") ;
00327     echo
"Voici ce qu'il affiche alors&nbsp;:" ;
00328     
finp() ;
00329     
00330     
pre_fichier
("obfus1.txt","cadrejaune") ;
00331     
00332     
p
("texte") ;
00333     echo
" Ce programme affiche (mais comment ?) la liste des nombres premiers entre 2 et 1000. " ;
00334     
finp() ;
00335     
00336     
p
("texte") ;
00337     echo
" Voici sa version en Python&nbsp;3:" ;
00338     
finp() ;
00339     
00340     
pre_fichier
("obfus3.py","cadrejaune") ;
00341     
00342     
p
("texte") ;
00343     echo
" Cet exemple montre à la fois la puissance du lambda-calcul et sa principale difficulté&nbsp;: " ;
00344     echo
" la relecture de tels codes. Bien s&ucirc;r on n'écrit pas ce code d'une seule traite, de gauche à droite. " ;
00345     echo
" On l'écrit progressivement à partir de la première instruction "
.b("map").", en rajoutant du code au fur et à mesure." ;
00346     
finp() ;
00347     
00348     
finsolution
() ; # contient un blockquote
00349     
00350     
finblockquote
() ; # tp
00351     
00352     ## -------------------------------------------------------------------------------------------
00353     
00354     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Modes de développement
00355     
00356     ## -------------------------------------------------------------------------------------------
00357     
00358     
blockquote
() ; # tp
00359     
00360     
blockquote
() ; # énoncé
00361     
00362     
p
("texte") ;
00363      echo
" Y a-t-il une différence entre l'exécution via "
.b("python&nbsp;script.py") ;
00364      echo
" et l'exécution via "
.b("ipython&nbsp;script.py")." pour les exemples du tuteur&nbsp;?" ;
00365     
finp() ;
00366     
00367     
p
("texte") ;
00368      echo
" Plus globalement, quel est l'intér&ecirc;t d'utiliser "
.b("ipython")." plut&ocirc;t que ".b("python") ;
00369      echo
" au niveau du développement ?" ;
00370     
finp() ;
00371     
00372     
p
("texte") ;
00373      echo
" Serait-ce mieux de développer avec un "
.b("Jupyter Notebook")."&nbsp;?" ;
00374     
finp() ;
00375     
00376     
finblockquote
() ; # énoncé
00377     
00378     
solutionTP
($numExo,$numSerie) ; # contient un blockquote
00379     
00380     
p
("texte") ;
00381     echo
"Il n'y a pas de différence majeure lorsqu'on exécute du code correct dans un script avec " ;
00382     echo
b
("python")." et ".b("ipython").", comme indiqué " ;
00383     echo
href
("https://plot.ly/python/ipython-vs-python/","ici").". " ;
00384     echo
" Pour les exemples du tuteur, l'exécution du script "
.href("ligv.py")." sans paramètre fournit des affichages " ;
00385     echo
" légèrement différents&nbsp;:" ;
00386     
finp() ;
00387     
00388     
# donner une copie de la sortie ipython/python d'un script OK et de ligv.py
00389     
00390     
p
("texte") ;
00391     
nbsp
(15) ;
00392     
$img
= "ligv.png" ;
00393     echo
href
($img,img($img,"",800)) ;
00394     
finp() ;
00395     
00396     
p
("texte") ;
00397      echo
" C'est sans doute mieux de développer avec un "
.b("Jupyter Notebook")." mais cela demande une installation particulière (voir la question 6)." ;
00398     
finp() ;
00399     
00400     
finsolution
() ; # contient un blockquote
00401     
00402     
finblockquote
() ; # tp
00403     
00404     ## -------------------------------------------------------------------------------------------
00405     
00406     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Archivage incrémental
00407     
00408     ## -------------------------------------------------------------------------------------------
00409     
00410     
blockquote
() ; # tp
00411     
00412     
blockquote
() ; # énoncé
00413     
00414     
p
("texte") ;
00415     echo
" On voudrait qu'à l'exécution du script "
.s_span("archcd.py","gbleuf")." il y ait une production automatique d'une archive " ;
00416     echo
" au format "
.b("tar") ;
00417     echo
" pour tous les fichiers de type xml avec numérotation de l'archive. " ;
00418     echo
" Par exemple la première fois que le script est exécuté, on produira l'archive "
.b("lesxml001.tar")." ; " ;
00419     echo
" la seconde fois, ce sera "
.b("lesxml002.tar")." etc. " ;
00420     echo
" L'algorithme de base ressemble certainement à " ;
00421     
finp() ;
00422     
00423     
pre_fichier
("archivage_alg.txt","cadrebleu") ;
00424     
00425     
p
("texte") ;
00426     echo
"Voici la sortie des deux premières exécutions du script&nbsp;:" ;
00427     
finp() ;
00428     
00429     
pre_fichier
("archivage-sortie.txt","cadrejaune") ;
00430     
00431     
finblockquote
() ; # énoncé
00432     
00433     
solutionTP
($numExo,$numSerie) ; # contient un blockquote
00434     
00435     
consulter
("archcd.py") ;
00436     
00437     
p
("texte") ;
00438     echo
" Pour voir le m&ecirc;me algorithme dans d'autres langages, cliquez " ;
00439     echo
href
("../Scripts/transvers.php","ici")."." ;
00440     
finp() ;
00441     
00442     
finsolution
() ; # contient un blockquote
00443     
00444     
finblockquote
() ; # tp
00445     
00446     ## -------------------------------------------------------------------------------------------
00447     
00448     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Utilisation d'un Jupyter notebook pour Python
00449     
00450     ## -------------------------------------------------------------------------------------------
00451     
00452     
blockquote
() ; # tp
00453     
00454     
blockquote
() ; # énoncé
00455     
00456     
p
("texte") ;
00457     echo
" Télécharger et compléter le "
.href("https://jupyter.org/","Jupyter ipython notebook")." nommé " ;
00458     echo
href
("../Notebooks/colExcel.ipynb","colExcel").". " ;
00459     
finp() ;
00460     
00461     
p
("texte") ;
00462     echo
" Pour mémoire, dans les salles du département informatique, " ;
00463     echo
" if faut, dans un terminal lancer la commande "
.b("_jupyter_notebook")." c'est-à-dire ".ghBleu("jupyter_notebook")." précédé du souligné ".ghBleu("_") ;
00464     echo
" pour pouvoir utiliser un serveur local de notebooks. Le disque "
.b("D")." et le répertoire ".b("Mes_notebooks")." permettent alors " ;
00465     echo
" d'enregistrer les fichiers. " ;
00466     echo
" Il est conseillé de télécharger le notebook "
.href("../Notebooks/colExcel.ipynb","colExcel")." dans le répertoire ".b("Mes_notebooks") ;
00467     echo
" avant de lancer le serveur Jupyter. " ;
00468     
finp() ;
00469     
00470     
p
("texte") ;
00471     echo
" Lorsqu'on exécute la commande "
.b("_jupyter_notebook").", le serveur jupyter est lancé et il faut le laisser actif pour pouvoir continuer. " ;
00472     echo
" Voici un exemple de session dans le terminal&nbsp;" ;
00473     
finp() ;
00474     
00475     
pre_fichier
("jupyter1.txt","cadrejaune") ;
00476     
00477     
p
("texte") ;
00478     echo
" Pour accéder au serveur, il faut utiliser via un navigateur Web le port indiqué et le jeton ("
.b("token").") indiqué. Ce n'est malheureusement pas simple car " ;
00479     echo
" ce qui est affiché dans le terminal n'est pas prévu pour un copier/coller. " ;
00480     echo
" Pour l'exemple précédent, l'URL de connection est&nbsp;:" ;
00481     
finp() ;
00482     
00483     
pre_fichier
("jupyter2.txt","cadrejaune") ;
00484     
00485     
p
("texte") ;
00486     echo
" Si vous n'avez tapé que la partie "
.b("http://127.0.0.1:8888")." il est possible de saisir ensuite le token, sans oublier les caractères ".b("/?token=").". " ;
00487     
finp() ;
00488     
00489     
p
("texte") ;
00490     echo
" Voici ce que vous devriez voir si tout se passe bien&nbsp;:" ;
00491     
finp() ;
00492     
00493     
p
("texte") ;
00494     
nbsp
(15) ;
00495     
$img
= "jupyter.png" ;
00496     echo
href
($img,img($img,"",800)) ;
00497     
finp() ;
00498     
00499     
p
("texte") ;
00500     echo
" Pour terminer proprement la session avec jupyter, il faut arr&ecirc;ter le serveur avec "
.b("deux fois Controle-C")." puis fermer le terminal." ;
00501     
finp() ;
00502     
00503     
p
("texte") ;
00504     echo
"Pour mémoire, le chemin absolu pour les notebooks est "
.b("/media/D/Mes_notebooks/").". " ;
00505     
finp() ;
00506     
00507     
finblockquote
() ; # énoncé
00508     
00509     
solutionTP
($numExo,$numSerie) ; # contient un blockquote
00510     
00511     
p
("texte") ;
00512     echo
" La solution est " ;
00513     echo
href
("../Notebooks/colExcel-solution.ipynb","ici").". " ;
00514     echo
" Un export automatique en PDF via LaTeX fournit le rendu suivant "
.href("colExcel-solution.pdf") ;
00515     echo
" qu'on viendra critiquer." ;
00516     
finp() ;
00517     
00518     
00519     
finsolution
() ; # contient un blockquote
00520     
00521     
finblockquote
() ; # tp
00522     
00523     ## -------------------------------------------------------------------------------------------
00524     
00525     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Script Python avec arguments en ligne de commande
00526     
00527     ## -------------------------------------------------------------------------------------------
00528     
00529     
blockquote
() ; # tp
00530     
00531     
blockquote
() ; # énoncé
00532     
00533     
p
("texte") ;
00534     echo
" Ecrire un script
$Python nommé ".b("colExcel.py")." qui fonctionne en ligne de commandes et qui correspond aux spécifications suivantes&nbsp;:" ;
00535     
finp() ;
00536     
00537     
ol() ;
00538     
00539     
debutli
() ; p() ;
00540      echo
"sans paramètre, le script fournit un rappel de la syntaxe et des exemples." ;
00541     
finp
() ; finli() ;
00542     
00543     
debutli
() ; p() ;
00544      echo
"le script importe le fichier "
.b("colExcelInc.py")." qui contient deux fonctions, à savoir " ;
00545      echo
b
("fromExcel()")." et ".b("toExcel()")." présentées dans l'exercice précédent." ;
00546     
finp
() ; finli() ;
00547     
00548     
debutli
() ; p() ;
00549      echo
" le fichier à importer "
.b("colExcelInc.py")." contient un auto-test permettant de vérifier que les deux " ;
00550      echo
" fonctions sont correctes." ;
00551     
finp
() ; finli() ;
00552     
00553     
debutli
() ; p() ;
00554      echo
"le script "
.b("colExcel.py")." admet un seul paramètre nommé ".b("inpCol").". " ;
00555      echo
"" ;
00556     
finp
() ; finli() ;
00557     
00558     
debutli
() ; p() ;
00559      echo
"le script "
.b("colExcel.py")." détecte la nature du seul parametre nommé ".b("inpCol")."&nbsp;; " ;
00560      echo
" si c'est un nombre entier strictement positif, on éxécute "
.b("toExcel()")."&nbsp;;" ;
00561      echo
" si c'est une chaine de caractères comportant un seul mot ne comportant que des majuscules (non accentuées), " ;
00562      echo
" on éxécute "
.b("fromExcel()")." ; dans les autres cas, on dit qu'il y a une erreur." ;
00563     
finp
() ; finli() ;
00564     
00565     
finol() ;
00566     
00567     
p
("texte") ;
00568     echo
"Voici le comportement attendu&nbsp;:" ;
00569     
finp() ;
00570     
00571     
pre_fichier
("colexcel.txt","cadre") ;
00572     
00573     
00574     
p
("texte") ;
00575     echo
" Si vous n'avez pas réussi à résoudre l'exercice précédent ou à télécharger ses solutions, vous " ;
00576     echo
" pouvez essayer de simplifier l'exercice en travaillant uniquement avec les nombres 1 à 26, c'est-à-dire avec ";
00577     echo
" les colonnes A à Z." ;
00578     
finp() ;
00579     
00580     
p
("texte") ;
00581     echo
" Ecrire ensuite un deuxième script
$Python nommé ".b("decritExcel.py")." qui fonctionne en ligne de commandes et qui correspond aux spécifications suivantes&nbsp;:" ;
00582     
finp() ;
00583     
00584     
ul() ;
00585     
00586     
debutli
() ; p() ;
00587      echo
"s'il n'y a pas de paramètre, on fournit un rappel de la syntaxe et un exemple puis on s'arr&ecirc;te." ;
00588     
finp
() ; finli() ;
00589     
00590     
debutli
() ; p() ;
00591      echo
"si le fichier Excel désigné par le paramètre n'est pas présent, on l'indique et on s'arr&ecirc;te." ;
00592     
finp
() ; finli() ;
00593     
00594     
debutli
() ; p() ;
00595      echo
"si le fichier est présent, on liste les colonnes présentes avec leur numéro et leur nom sous Excel (A pour 1, B pour 2...)." ;
00596     
finp
() ; finli() ;
00597     
00598     
finul() ;
00599     
00600     
p
("texte") ;
00601     echo
"Pour les expert(e)s, on pourra de plus fournir le type des colonnes, la valeur minimale, la valeur maximale et le nombre de valeurs manquantes," ;
00602     echo
" comme ci-dessous, pour le fichier "
.href("iris.xlsx")."&nbsp;:" ;
00603     
finp() ;
00604     
00605     
pre_fichier
("decritirisPython3.txt","cadre") ;
00606     
00607     
finblockquote
() ; # énoncé
00608     
00609     
solutionTP
($numExo,$numSerie) ; # contient un blockquote
00610     
00611     # solution :
00612     
00613     
p
("texte") ;
00614     echo
"Pour le premier script, on viendra rapatrier " ;
00615     echo
href
("colExcel.py") ;
00616     echo
" et "
.href("colExcelInc.py").". " ;
00617     echo
" On viendra en particulier vérifier que les "
.em("auto-tests")." affichent bien " ;
00618     echo
" ce qu'on demande. " ;
00619     
finp() ;
00620     
00621     
p
("texte") ;
00622     echo
"Pour le second script, nous ne fournissons volontairement aucune solution. " ;
00623     echo
" Toutefois, la liste des liens ci-dessous montre que c'est un problème simple " ;
00624     echo
" avec plusieurs solutions, en Python \"direct\" ou avec " ;
00625     echo
href
("https://pandas.pydata.org/","pandas").". " ;
00626     
finp() ;
00627     
00628     
pre_fichier
("tp2-complements.txt","cadrebleu") ;
00629     
00630     
finsolution
() ; # contient un blockquote
00631     
00632     
finblockquote
() ; # tp
00633     
00634     #############################################################################
00635     
00636     
finTP
($numSerie) ;
00637     
?>

Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.

 

 

retour gH    Retour à la page principale de   (gH)