[resolu] Ajouter l'autocomplétion sur un raw_input()

Ajouter l'autocomplétion sur un raw_input() [resolu] - Python - Programmation

Marsh Posté le 24-04-2008 à 09:32:31    

'jour amis progueux [:papatte]
 
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 :o
 
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 [:opus dei]


Message édité par wedgeant le 29-04-2008 à 08:06:25

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-04-2008 à 09:32:31   

Reply

Marsh Posté le 24-04-2008 à 09:57:56    

je comprend pas vraiment le pb :x


---------------
Python Python Python
Reply

Marsh Posté le 24-04-2008 à 09:59:47    

[:wark0][:wark0][:wark0]


---------------
En théorie, la théorie et la pratique sont identiques, en pratique, non.
Reply

Marsh Posté le 24-04-2008 à 10:02:22    


[:cerveau kneu]

Spoiler :

[:wark0]


 
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 :spamafote:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

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" ? :O
 
C'est trivial :>


---------------
Python Python Python
Reply

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
et de stocker ça dans un "catalogue" ? :O
 
C'est trivial :>


 [:prozac]  
 
Son problème c'est pas de récupérer les répertoires mais d'autocompléter [:pingouino]

Message cité 2 fois
Message édité par masklinn le 24-04-2008 à 10:30:14

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-04-2008 à 10:31:05    

UP \o/

Reply

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
et de stocker ça dans un "catalogue" ? :O
 
C'est trivial :>


ouais, mais j'me disais que ça avait p'tet déjà été intégré dans un module tout fait :spamafote:
bon ben je vais faire comme ça alors :jap:
 

masklinn a écrit :

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)


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 :jap:
 
merci bien :o


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

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 [:pingouino]


étant donné que je veux autocompléter avec la liste des répertoires et/ou des fichiers, ça se complète [:god]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

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() ?


---------------
TriScale innov
Reply

Marsh Posté le 24-04-2008 à 10:37:25   

Reply

Marsh Posté le 24-04-2008 à 10:40:42    

wedgeant a écrit :


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 :jap:


Ouais enfin suffit d'avoir un filter + index :o

 

Genre un truc du style

Code :
  1. def completer(text, state):
  2.    try:
  3.        return [entry for entry in os.listdir(dir) if entry.startswith(text)][state]
  4.    except IndexError, e:
  5.        return None



Message édité par masklinn le 24-04-2008 à 10:44:00

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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() ?


[:jar jar]
 
je m'étais p'tet pas exprimé super clairement en fait [:cerveau klem]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

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


---------------
TriScale innov
Reply

Marsh Posté le 24-04-2008 à 11:04:55    

Reply

Marsh 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 :o
 
pour résumer, retourne sur OSA et arrête de faire le clown [:sarko]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-04-2008 à 11:20:16    

J'étais pas censé savoir que tu l'avais vu.
Alors va chier.


---------------
Be the one with the flames.
Reply

Marsh Posté le 24-04-2008 à 12:11:57    

Riot a écrit :

J'étais pas censé savoir que tu l'avais vu.
Alors va chier.

[:jpa]  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-04-2008 à 21:46:49    

[:rofl]

Reply

Marsh Posté le 28-04-2008 à 13:39:38    

re  [:bricokilt]  
 
bon alors j'ai essayé un peu, mais j'arrive pas à faire ce que je veux :/
 
Masklinn, j'ai repris ton code :

Code :
  1. def completer(text, state):
  2.    try:
  3.        return [entry for entry in os.listdir(dir) if entry.startswith(text)][state]
  4.    except IndexError, e:
  5.        return None


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 "/" :jap:
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 :o), donc je teste si c'est un répertoire existant, et vu que c'est pas le cas, "dir" est toujours à "/" :jap:
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 :(


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 28-04-2008 à 14:05:09    

J'ai jamais utilisé readline donc je peux pas t'aider plus que ça :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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 :(


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

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.


Message édité par e_esprit le 28-04-2008 à 14:46:29

---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

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 :
  1. #! /usr/bin/env python
  2.  
  3. import readline
  4. import os
  5.  
  6. def completer(text, state):
  7.    try:
  8.        return [entry for entry in os.listdir('/') if entry.startswith(text)][state]
  9.    except IndexError, e:
  10.        return None
  11.  
  12. readline.parse_and_bind("tab: complete" )
  13. readline.set_completer(completer)
  14. line = raw_input('prompt> ')


à ce niveau, ça complète uniqement sur un niveau, c'est à dire '/' et ses sous-reps :jap:
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" :jap:
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é :sweat:
 
mici en tt cas :)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 28-04-2008 à 15:19:06    

A peaufiner mais à priori ca le fait plutot pas mal :D :

Code :
  1. #! /usr/bin/python
  2.  
  3. import readline
  4. import os
  5.  
  6. def completer(text, state):
  7.   try:
  8.      return [entry for entry in os.listdir(os.path.dirname(readline.get_line_buffer())) if entry.startswith(text)][state]
  9.   except IndexError, e:
  10.      return None
  11.  
  12. readline.parse_and_bind("tab: complete" )
  13. readline.set_completer(completer)
  14. line = raw_input('prompt> ')


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

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()  [:vyse]  
 
bon, je regarde ça ce soir, merci en tout cas   [:el awrence]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 29-04-2008 à 08:06:08    

Ca marcheu [:jar jar]
J'ai plus qu'à adapter un peu mais c'est bon, merfi :jap:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 29-04-2008 à 08:52:07    

faut il en conclure que l'elite de prog est en realité sur OSA [:dawa]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
[:dehors2]


---------------
En théorie, la théorie et la pratique sont identiques, en pratique, non.
Reply

Marsh Posté le 29-04-2008 à 09:10:07    

Il faut [:prodigy]
Ici c'est l'élite du .NET et du Java [:prodigy]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 29-04-2008 à 09:11:42    

wedgeant a écrit :

Il faut [:prodigy]
Ici c'est l'élite du .NET et du Java [:prodigy]


 
t'as oublié le php :vomi:


---------------
En théorie, la théorie et la pratique sont identiques, en pratique, non.
Reply

Marsh Posté le 29-04-2008 à 09:13:11    

[:kwak]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 29-04-2008 à 09:16:26    

wedgeant a écrit :

Il faut [:prodigy]
Ici c'est l'élite du .NET et du Java [:prodigy]


Non mais ça suffit ces conneries, c'est pas parce que vous êtes des barbus pourris que vous pouvez insulter les gens comme ça [:pingouino]

 

Si vous continuez on vous envoie Magicbuzz et Jovalise, zallez moins faire les marioles :fou:


Message édité par masklinn le 29-04-2008 à 09:16:53

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 29-04-2008 à 09:18:53    

[:rofl]
 
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 [:cupra]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 29-04-2008 à 09:23:06    

wedgeant a écrit :

[:rofl]
 
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 [:cupra]


Même pas en rêve [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-04-2008 à 22:54:44    

e_esprit a écrit :

A peaufiner mais à priori ca le fait plutot pas mal :D :

Code :
  1. #! /usr/bin/python
  2.  
  3. import readline
  4. import os
  5.  
  6. def completer(text, state):
  7.   try:
  8.      return [entry for entry in os.listdir(os.path.dirname(readline.get_line_buffer())) if entry.startswith(text)][state]
  9.   except IndexError, e:
  10.      return None
  11.  
  12. readline.parse_and_bind("tab: complete" )
  13. readline.set_completer(completer)
  14. line = raw_input('prompt> ')


Ah merde la ligne 8 [:pingouino]


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 05-05-2008 à 08:21:09    

elle a quoi la ligne 8 ?? [:noxauror]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 05-05-2008 à 16:56:41    

Elle est illisible.


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 05-05-2008 à 16:58:26    

oh ben j'trouve pas moi [:cerveau klem]
spa comme s'il avait fait de l'obfuscate quoi :o


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 05-05-2008 à 16:58:42    

Mais non :D
http://docs.python.org/tut/node7.h [...] 0000000000


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 05-05-2008 à 17:08:50    

Shinuza a écrit :

Elle est illisible.


Uh? Elle a rien d'illisible [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-05-2008 à 19:59:23    

J'aurais sorti le
 

Code :
  1. os.listdir(os.path.dirname(readline.get_line_buffer())


 
dans une variable [:cosmoschtroumpf]


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed