Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1203 connectés 

  FORUM HardWare.fr
  Programmation
  Python

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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

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

n°1723301
wedgeant
Da penguin inside
Posté le 24-04-2008 à 09:32:31  profilanswer
 

'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
mood
Publicité
Posté le 24-04-2008 à 09:32:31  profilanswer
 

n°1723316
BenO
Profil: Chercheur
Posté le 24-04-2008 à 09:57:56  profilanswer
 

je comprend pas vraiment le pb :x


---------------
Python Python Python
n°1723319
el_barbone
too old for this shit ...
Posté le 24-04-2008 à 09:59:47  profilanswer
 

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


---------------
En théorie, la théorie et la pratique sont identiques, en pratique, non.
n°1723321
wedgeant
Da penguin inside
Posté le 24-04-2008 à 10:02:22  profilanswer
 


[: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
n°1723333
BenO
Profil: Chercheur
Posté le 24-04-2008 à 10:10:08  profilanswer
 

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
n°1723362
masklinn
í dag viðrar vel til loftárása
Posté le 24-04-2008 à 10:27:49  profilanswer
 

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
n°1723369
perchut2
Hell, it's about time...
Posté le 24-04-2008 à 10:31:05  profilanswer
 

UP \o/

n°1723370
wedgeant
Da penguin inside
Posté le 24-04-2008 à 10:31:14  profilanswer
 

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
n°1723371
wedgeant
Da penguin inside
Posté le 24-04-2008 à 10:32:19  profilanswer
 

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
n°1723380
franceso
Posté le 24-04-2008 à 10:37:25  profilanswer
 

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
mood
Publicité
Posté le 24-04-2008 à 10:37:25  profilanswer
 

n°1723386
masklinn
í dag viðrar vel til loftárása
Posté le 24-04-2008 à 10:40:42  profilanswer
 

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
n°1723388
wedgeant
Da penguin inside
Posté le 24-04-2008 à 10:41:28  profilanswer
 

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
n°1723390
franceso
Posté le 24-04-2008 à 10:43:12  profilanswer
 

apparemment, il y a pas mal d'exemples intéressants ici : http://albatross.dnsdojo.net/apach [...] ompletions


---------------
TriScale innov
n°1723430
Riot
Buy me a riot
Posté le 24-04-2008 à 11:04:55  profilanswer
 
n°1723449
wedgeant
Da penguin inside
Posté le 24-04-2008 à 11:13:46  profilanswer
 


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
n°1723463
Riot
Buy me a riot
Posté le 24-04-2008 à 11:20:16  profilanswer
 

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


---------------
Be the one with the flames.
n°1723515
gilou
Modérateur
Modzilla
Posté le 24-04-2008 à 12:11:57  profilanswer
 

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é!  --
n°1724020
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-04-2008 à 21:46:49  profilanswer
 

[:rofl]

n°1725586
wedgeant
Da penguin inside
Posté le 28-04-2008 à 13:39:38  profilanswer
 

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
n°1725624
masklinn
í dag viðrar vel til loftárása
Posté le 28-04-2008 à 14:05:09  profilanswer
 

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
n°1725637
wedgeant
Da penguin inside
Posté le 28-04-2008 à 14:22:13  profilanswer
 

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
n°1725651
e_esprit
Posté le 28-04-2008 à 14:46:15  profilanswer
 

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.
n°1725671
wedgeant
Da penguin inside
Posté le 28-04-2008 à 15:03:20  profilanswer
 

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
n°1725685
e_esprit
Posté le 28-04-2008 à 15:19:06  profilanswer
 

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.
n°1725704
wedgeant
Da penguin inside
Posté le 28-04-2008 à 15:56:09  profilanswer
 

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
n°1725922
wedgeant
Da penguin inside
Posté le 29-04-2008 à 08:06:08  profilanswer
 

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
n°1725942
el_barbone
too old for this shit ...
Posté le 29-04-2008 à 08:52:07  profilanswer
 

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.
n°1725950
wedgeant
Da penguin inside
Posté le 29-04-2008 à 09:10:07  profilanswer
 

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


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°1725952
el_barbone
too old for this shit ...
Posté le 29-04-2008 à 09:11:42  profilanswer
 

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.
n°1725953
wedgeant
Da penguin inside
Posté le 29-04-2008 à 09:13:11  profilanswer
 

[:kwak]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°1725956
masklinn
í dag viðrar vel til loftárása
Posté le 29-04-2008 à 09:16:26  profilanswer
 

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
n°1725958
wedgeant
Da penguin inside
Posté le 29-04-2008 à 09:18:53  profilanswer
 

[: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
n°1725960
masklinn
í dag viðrar vel til loftárása
Posté le 29-04-2008 à 09:23:06  profilanswer
 

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
n°1727124
Shinuza
This is unexecpected
Posté le 30-04-2008 à 22:54:44  profilanswer
 

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.
n°1728365
wedgeant
Da penguin inside
Posté le 05-05-2008 à 08:21:09  profilanswer
 

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


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°1728686
Shinuza
This is unexecpected
Posté le 05-05-2008 à 16:56:41  profilanswer
 

Elle est illisible.


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
n°1728687
wedgeant
Da penguin inside
Posté le 05-05-2008 à 16:58:26  profilanswer
 

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
n°1728688
e_esprit
Posté le 05-05-2008 à 16:58:42  profilanswer
 

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.
n°1728695
masklinn
í dag viðrar vel til loftárása
Posté le 05-05-2008 à 17:08:50  profilanswer
 

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
n°1728772
Shinuza
This is unexecpected
Posté le 05-05-2008 à 19:59:23  profilanswer
 

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.
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

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

 

Sujets relatifs
problème avec "ALTER SESSION SET NSL_TERRITORY" [résolu][BATCH]Formualire de saisie en masquant l'input
[Résolu] Du mal avec une requête sur tables à relation réfléchie[RESOLU] "applet not initiated" : quelle erreur dans le code HTML ?
[RESOLU] probleme file.exists()[résolu]Optimiser la prévisualisation en php+javascript
[Resolu]comment crée un fichier.jar?[Résolu] Insertion image dans formulaire Access
Transfert de variable [résolu][Résolu] Menu déroulant animé : setTimeout()
Plus de sujets relatifs à : [resolu] Ajouter l'autocomplétion sur un raw_input()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR