Ajouter l'autocomplétion sur un raw_input() [resolu] - Python - Programmation
Marsh Posté le 24-04-2008 à 09:57:56
je comprend pas vraiment le pb :x
Marsh Posté le 24-04-2008 à 09:59:47
Marsh Posté le 24-04-2008 à 10:02:22
Spoiler : |
benO: pour résumer, j'ai un script en python qui pose des questions au gens via des raw_input(). Pour répondre à ces questions, je voudrais que les gens puissent simplement appuyer sur la touche TAB quand je leur demande le nom d'un répertoire ou d'un fichier, et que ça fasse de l'autocomplétion comme sur une ligne de commande quoi
Marsh Posté le 24-04-2008 à 10:10:08
Bah, je vois pas d'autre solution que de lire l'intégralité du contenu du répertoire
et de stocker ça dans un "catalogue" ?
C'est trivial :>
Marsh Posté le 24-04-2008 à 10:27:49
http://kogs-www.informatik.uni-ham [...] hon_tricks
Voir la doc de readline (la fonction qui t'intéresse le plus est probablement readline.set_completer, en plus de readline.parse_and_bind)
BenO a écrit : Bah, je vois pas d'autre solution que de lire l'intégralité du contenu du répertoire |
Son problème c'est pas de récupérer les répertoires mais d'autocompléter
Marsh Posté le 24-04-2008 à 10:31:14
BenO a écrit : Bah, je vois pas d'autre solution que de lire l'intégralité du contenu du répertoire |
ouais, mais j'me disais que ça avait p'tet déjà été intégré dans un module tout fait
bon ben je vais faire comme ça alors
masklinn a écrit : http://kogs-www.informatik.uni-ham [...] hon_tricks |
yep, comme je disais à benO, je pensais à un module "tout fait", mais vu qu'y'a pas, la doc de readline est assez claire ... suffit juste que je remplisse correctement le bazar
merci bien
Marsh Posté le 24-04-2008 à 10:32:19
masklinn a écrit : Son problème c'est pas de récupérer les répertoires mais d'autocompléter |
étant donné que je veux autocompléter avec la liste des répertoires et/ou des fichiers, ça se complète
Marsh Posté le 24-04-2008 à 10:37:25
Je crois que je viens de comprendre : en fait, ton problème, c'est pas d'utiliser readline, mais de construire la fonction de completion que tu vas passer en argument de set_completer() ?
Marsh Posté le 24-04-2008 à 10:40:42
wedgeant a écrit :
|
Ouais enfin suffit d'avoir un filter + index
Genre un truc du style
Code :
|
Marsh Posté le 24-04-2008 à 10:41:28
franceso a écrit : Je crois que je viens de comprendre : en fait, ton problème, c'est pas d'utiliser readline, mais de construire la fonction de completion que tu vas passer en argument de set_completer() ? |
je m'étais p'tet pas exprimé super clairement en fait
Marsh Posté le 24-04-2008 à 10:43:12
apparemment, il y a pas mal d'exemples intéressants ici : http://albatross.dnsdojo.net/apach [...] ompletions
Marsh Posté le 24-04-2008 à 11:04:55
ReplyMarsh Posté le 24-04-2008 à 11:13:46
je te remercie beaucoup pour ton inestimable intervention sur ce topic, mais si j'ai posé ma question, c'est que le topic que tu cites ne satisfaisait pas ma demande
pour résumer, retourne sur OSA et arrête de faire le clown
Marsh Posté le 24-04-2008 à 11:20:16
J'étais pas censé savoir que tu l'avais vu.
Alors va chier.
Marsh Posté le 24-04-2008 à 12:11:57
Riot a écrit : J'étais pas censé savoir que tu l'avais vu. |
A+,
Marsh Posté le 28-04-2008 à 13:39:38
re
bon alors j'ai essayé un peu, mais j'arrive pas à faire ce que je veux
Masklinn, j'ai repris ton code :
Code :
|
et j'ai essayé de l'adapter, mais ça coince sur la définition de "dir".
Par exemple, voila ce que j'essaye de faire:
Citation : -> /<TAB> |
à ce moment là, le param "text" est à blanc, donc je peux définir dir comme étant "/", et dans ce cas, la fonction me renvoie la liste des sous-rep de "/"
Imaginons que je commence à taper un nom:
Citation : -> /ho<TAB> |
A ce moment, "text" vaut "ho" et là je ne peux pas définir dir comme étant "/ho" (ça s'rait idiot ), donc je teste si c'est un répertoire existant, et vu que c'est pas le cas, "dir" est toujours à "/"
On continue
Citation : -> /home/<TAB> |
Maintenant, "text" est encore à blanc, mais il faudrait que "dir" devienne "/home/" et plus "/", et là je vois pas trop comment faire
bref, j'y arrive pas
Marsh Posté le 28-04-2008 à 14:05:09
J'ai jamais utilisé readline donc je peux pas t'aider plus que ça
Marsh Posté le 28-04-2008 à 14:22:13
ok, merci
et en cherchant un peu partout sur les projets qui utilisent python ou les forums, j'ai rien vu qui faisait ça
Marsh Posté le 28-04-2008 à 14:46:15
Tu peux donner le code ?
Juste la partie qui fait la complétion, pas tout ton programme, mais qui fonctionne (pour pouvoir tester sans tout avoir à recoder), avec un __main__ de test quoi.
Marsh Posté le 28-04-2008 à 15:03:20
je l'ai pas sous la main, et comme j'ai fais plein de modifs au fur et à mesure de mes essais, le code qui doit rester doit être tout pourri
si tu as un peu de temps, tu peux partir de ça (c'est ce que j'avais fais):
Code :
|
à ce niveau, ça complète uniqement sur un niveau, c'est à dire '/' et ses sous-reps
après, faut trouver un moyen de garder en mémoire l'arborescence déjà "validée" pour parcourir le bon rep via listdir() et non plus '/'
text contient uniquement la dernière partie de ce que tu as tapé, donc si tu tapes "/home/e_esp<TAB>", text contient "e_esp"
et il y a aussi la méthode readline.get_line_buffer() qui permet de récupérer des infos sur le texte déjà tapé
mici en tt cas
Marsh Posté le 28-04-2008 à 15:19:06
A peaufiner mais à priori ca le fait plutot pas mal :
Code :
|
Marsh Posté le 28-04-2008 à 15:56:09
il me semble que j'avais essayé quelque chose comme ça, mais j'avais pas pensé à os.path.dirname()
bon, je regarde ça ce soir, merci en tout cas
Marsh Posté le 29-04-2008 à 08:06:08
Ca marcheu
J'ai plus qu'à adapter un peu mais c'est bon, merfi
Marsh Posté le 29-04-2008 à 08:52:07
faut il en conclure que l'elite de prog est en realité sur OSA
Marsh Posté le 29-04-2008 à 09:10:07
Il faut
Ici c'est l'élite du .NET et du Java
Marsh Posté le 29-04-2008 à 09:11:42
wedgeant a écrit : Il faut |
t'as oublié le php
Marsh Posté le 29-04-2008 à 09:13:11
Marsh Posté le 29-04-2008 à 09:16:26
wedgeant a écrit : Il faut |
Non mais ça suffit ces conneries, c'est pas parce que vous êtes des barbus pourris que vous pouvez insulter les gens comme ça
Si vous continuez on vous envoie Magicbuzz et Jovalise, zallez moins faire les marioles
Marsh Posté le 29-04-2008 à 09:18:53
Bon ok, on va dire que Masklinn et quelques autres mériteraient de faire partie de la swat team de la section prog d'OSA
Marsh Posté le 29-04-2008 à 09:23:06
wedgeant a écrit : |
Même pas en rêve
Marsh Posté le 30-04-2008 à 22:54:44
e_esprit a écrit : A peaufiner mais à priori ca le fait plutot pas mal :
|
Ah merde la ligne 8
Marsh Posté le 05-05-2008 à 08:21:09
elle a quoi la ligne 8 ??
Marsh Posté le 05-05-2008 à 16:56:41
Elle est illisible.
Marsh Posté le 05-05-2008 à 16:58:26
oh ben j'trouve pas moi
spa comme s'il avait fait de l'obfuscate quoi
Marsh Posté le 05-05-2008 à 16:58:42
Mais non
http://docs.python.org/tut/node7.h [...] 0000000000
Marsh Posté le 05-05-2008 à 17:08:50
Shinuza a écrit : Elle est illisible. |
Uh? Elle a rien d'illisible
Marsh Posté le 05-05-2008 à 19:59:23
J'aurais sorti le
Code :
|
dans une variable
Marsh Posté le 24-04-2008 à 09:32:31
'jour amis progueux
je suis en train de réécrire mon soft en python (écrit en bash à l'origine) et je souhaiterais ajouter l'autocomplétion pour les noms de répertoires ou de fichiers sur certains raw_input().
Un petit exemple: à certains moments, je demande à l'utilisateur le nom d'un fichier qui se trouve sur disque et qui a normalement une extension ".iso". Je voudrais qu'à grands coups de <TAB>, on puisse atteindre tous les ".iso" du répertoire courant ou du répertoire dont on a commencé à taper le nom ... de l'autocomplétion quoi
En fouinant un peu, j'ai vu qu'il fallait utiliser le module readline, mais tous les exemples que j'ai trouvés ne correspondent qu'à une autocomplétion pour le shell python ou pour une autocomplétion sur des noms particuliers définis dans une sorte de catalogue, à l'avance.
J'ai bien pensé à créer le catalogue en parcourant les sous répertoires et les fichiers etc ... mais ça me parait lourd, du coup je me dis qu'il doit bien exister une solution plus simple ... non
Message édité par wedgeant le 29-04-2008 à 08:06:25
---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW