Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2022-07-24T21:05:47+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Wct, assistant pour l’arborescence des ordinateurs., message #2443722022-07-24T21:05:47+02:00Lokasku/@Lokaskuhttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244372<p>Bonjour,</p>
<p>L’assistant de recherche et de modération <em>Wct</em> fait aujourd’hui, enfin, correctement tout ce qu’il est censé faire. La forme de la commande est la suivante :</p>
<div class="hljs-code-div hljs-code-py"><pre><code class="hljs language-py">python /path/to/wct.py <path> (<pattern> | <regex>) [-d | --delete]
</code></pre></div>
<p>Je ne vais pas autant développer chaque argument comme dans le README du projet GitHub (<em>lien en bas</em>), mais je vais tout de même vous expliquer simplement l’utilité de chacun des arguments :</p>
<ul>
<li><code><path></code> : chemin où doit commencer la recherche, ou le point d’entrer, si vous préférez ;</li>
<li><code><pattern></code> et <code><regex></code> : le premier correspond au motif que l’on cherche, et le second correspond comme son nom l’indique à une expression régulière. Notez que c’est sois l’un sois l’autre, et que le pattern sera considéré comme pattern uniquement s’il ne correspond aucunement à une regex.</li>
<li><code>-d</code> ou <code>--delete</code> : argument optionnel qui permet à la fin de la recherche de supprimer ce qui a été trouvé. Plus justement, ça ne supprime pas directement ce qui a été trouvé, ça vous propose soit de tout supprimer (<code>DE</code>), de quitter (<code>Enter</code>) ou de choisir à l’aide des index ceux que vous ne voulez surtout pas supprimer.</li>
</ul>
<p>Si le projet vous intéresse, vous pouvez toujours y contribuer (<em>Wct est développé en Python</em>) en suivant le lien GitHub ci-dessous, ou si vous voulez simplement l’utiliser ou en savoir plus à son propos, je vous invites à aller voir le README associé, toujours à l’aide du lien ci-dessous :</p>
<p><strong>+</strong> <a href="https://github.com/b4-b4/wct">https://github.com/b4-b4/wct</a></p>
<p>Vous l’avez sûrement remarqué, le préfixe de <em>wct</em> est fatalement <code>python3 /path/to/wct.py</code>, je le reconnais, c’est honteux. C’est en fait dû au fait que je n’ai réussi sur aucun de mes ordinateurs à le déposer sur PyPi, mais en théorie, ça devrait y faire son apparition un jour ou l’autre.</p>
<p>Voici deux exemples qui illustrent le nouveau fonctionnement du projet :</p>
<p><em>Recherche le motif "v" dans tout le répertoire <code>NazaraEngine</code></em></p>
<div class="hljs-code-div hljs-code-py"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span></div><pre><code class="hljs language-py">b4b4@b4b4-old-laptop:~/Documents/dev$ python3 wct/wct.py NazaraEngine/ v
<span class="hljs-number">2</span> folders, <span class="hljs-number">22</span> files.
| NazaraEngine/thirdparty/include/vma
| NazaraEngine/thirdparty/include/vma/vk_mem_alloc.h
| NazaraEngine/thirdparty/include/vma/vk_mem_alloc.natvis
| NazaraEngine/thirdparty/include/vulkan
| NazaraEngine/thirdparty/include/vulkan/vk_icd.h
| NazaraEngine/thirdparty/include/vulkan/vk_layer.h
| NazaraEngine/thirdparty/include/vulkan/vk_platform.h
| NazaraEngine/thirdparty/include/vulkan/vk_sdk_platform.h
| NazaraEngine/thirdparty/include/vulkan/vulkan.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_android.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_beta.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_core.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_directfb.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_fuchsia.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_ggp.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_ios.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_macos.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_metal.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_vi.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_wayland.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_win32.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_xcb.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_xlib.h
| NazaraEngine/thirdparty/include/vulkan/vulkan_xlib_xrandr.h
[ <span class="hljs-number">0.05797529220581055</span> seconds ]
</code></pre></div>
<p><em>Recherche toujours le motif "v" dans tout le répertoire <code>NazaraEngine</code>, et demande à ce que la suppression des résultats soit ajouté</em></p>
<div class="hljs-code-div hljs-code-py"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span></div><pre><code class="hljs language-py">b4b4@b4b4-old-laptop:~/Documents/dev$ python3 wct/wct.py NazaraEngine/ v --delete
<span class="hljs-number">2</span> folders, <span class="hljs-number">22</span> files.
<span class="hljs-number">0</span> | NazaraEngine/thirdparty/include/vma
<span class="hljs-number">1</span> | NazaraEngine/thirdparty/include/vma/vk_mem_alloc.h
<span class="hljs-number">2</span> | NazaraEngine/thirdparty/include/vma/vk_mem_alloc.natvis
<span class="hljs-number">3</span> | NazaraEngine/thirdparty/include/vulkan
<span class="hljs-number">4</span> | NazaraEngine/thirdparty/include/vulkan/vk_icd.h
<span class="hljs-number">5</span> | NazaraEngine/thirdparty/include/vulkan/vk_layer.h
<span class="hljs-number">6</span> | NazaraEngine/thirdparty/include/vulkan/vk_platform.h
<span class="hljs-number">7</span> | NazaraEngine/thirdparty/include/vulkan/vk_sdk_platform.h
<span class="hljs-number">8</span> | NazaraEngine/thirdparty/include/vulkan/vulkan.h
<span class="hljs-number">9</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_android.h
<span class="hljs-number">10</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_beta.h
<span class="hljs-number">11</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_core.h
<span class="hljs-number">12</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_directfb.h
<span class="hljs-number">13</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_fuchsia.h
<span class="hljs-number">14</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_ggp.h
<span class="hljs-number">15</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_ios.h
<span class="hljs-number">16</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_macos.h
<span class="hljs-number">17</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_metal.h
<span class="hljs-number">18</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_vi.h
<span class="hljs-number">19</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_wayland.h
<span class="hljs-number">20</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_win32.h
<span class="hljs-number">21</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_xcb.h
<span class="hljs-number">22</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_xlib.h
<span class="hljs-number">23</span> | NazaraEngine/thirdparty/include/vulkan/vulkan_xlib_xrandr.h
[ <span class="hljs-number">0.06256699562072754</span> seconds ]
Using the index, write the individual items you do <span class="hljs-keyword">not</span> want to delete separated by commas.
Otherwise, enter <DE> to delete everything <span class="hljs-keyword">or</span> <Enter> to exit.
>
</code></pre></div>Wct, assistant pour l’arborescence des ordinateurs., message #2443662022-07-23T15:43:20+02:00NightProg/@NightProghttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244366<blockquote>
<p>Si vous cherchez toujours une bonne alternative à argparse, je conseille chaleureusement l’excellent click, de Pallets, qui a une interface très agréable (comme toutes les libs de Pallets, en réalité <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"> ).</p>
</blockquote>
<p>je connais , et je l’adore , et je le conseille </p>Wct, assistant pour l’arborescence des ordinateurs., message #2442652022-07-16T11:16:39+02:00Amaury/@Amauryhttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244265<figure><blockquote>
<blockquote>
<p>Qu’il y ait une certaine marche à passer pour apprendre à l’utiliser je veux bien l’entendre, mais qu’est-ce qui rendrait la syntaxe d’argparse incompréhensible ?</p>
</blockquote>
<p>alors pour ma defance je n’ai pas dit que "la syntaxe d’argparse etait incompréhensible" juste que je ne l’aimais pas. Tout dev a ses opinions sur des lib, moi j’en ai une sur argparse qui est plutot mauvaise et voila (cane veux pas dire que <code>argparse</code> est nul ) </p>
<p></p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16349/smwct-assistant-de-recherche-et-de-moderation-pour-larborescence-des-ordinateurs/?page=2#p244256">NightProg</a></figcaption></figure>
<p>Si vous cherchez toujours une bonne alternative à <code>argparse</code>, je conseille chaleureusement l’excellent <a href="https://click.palletsprojects.com/en/8.1.x/"><code>click</code></a>, de Pallets, qui a une interface très agréable (comme toutes les libs de Pallets, en réalité <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"> ).</p>Wct, assistant pour l’arborescence des ordinateurs., message #2442562022-07-15T22:38:31+02:00NightProg/@NightProghttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244256<blockquote>
<p>Qu’il y ait une certaine marche à passer pour apprendre à l’utiliser je veux bien l’entendre, mais qu’est-ce qui rendrait la syntaxe d’argparse incompréhensible ?</p>
</blockquote>
<p>alors pour ma defance je n’ai pas dit que "la syntaxe d’argparse etait incompréhensible" juste que je ne l’aimais pas. Tout dev a ses opinions sur des lib, moi j’en ai une sur argparse qui est plutot mauvaise et voila (cane veux pas dire que <code>argparse</code> est nul ) </p>Wct, assistant pour l’arborescence des ordinateurs., message #2441882022-07-08T14:40:22+02:00adri1/@adri1https://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244188<blockquote>
<p>Pour faire simple, la base du programme que tu me propose résout tout ces problèmes ? Je trouve étonnant qu’un programme entièrement basé sur la commande <code>tree</code> elle même d’Unix soit si mal faite.</p>
</blockquote>
<p>En plus du fait que tu ne regardais pas le vrai <code>tree</code>, il y a deux choses à considérer :</p>
<ul>
<li><code>tree</code> affiche toute l’arborescence depuis ton point d’entrée d’une façon "jolie", il est donc raisonnable qu’il visite tout l’arbre une fois en le triant. C’est un besoin différent de <code>find</code>, et c’est aussi différent de ce que tu fais en visitant l’arbre deux fois, dont une fois dans l’ordre trié.</li>
<li>adapter un algo C directement en Python est rarement une bonne idée. Les structures de données ne sont pas du tout les mêmes, et Python s’exécute dans une VM hyper-dynamique et de fait plutôt lente. Un bon algo C peut avoir des performances désastreuses en Python, et souvent en Python ça vaut le coup d’appeler du code bas niveau même si l’algo implémenté dans ce bas niveau est sous-optimal plutôt qu’un algo optimal en Python pur parce que le coût de la VM est gigantesque.</li>
</ul>
<p>Un truc que tu peux tester est comparer les trois commandes dans ton dépôt git (en les faisant tourner plusieurs fois jusqu’à ce que les temps se stabilisent pour éviter les effets de cache) :</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span></div><pre><code class="hljs language-text">$ time python wct.py s . re
$ time python -c "from pathlib import Path;print(*Path().glob('**/*re*'), sep='\n')"
$ time find . -name "*re*"
</code></pre></div>
<p>La première est ton code, la deuxième te donnera une idée du temps minimal que tu peux espérer atteindre en Python pur, et la troisième pour comparer avec <code>find</code> (sur un test rapide chez moi, <code>find</code> est trois fois plus rapide que la solution avec <code>glob</code> ! Cet écart va sûrement dépendre aussi de la taille de l’arborescence et de la requête).</p>Wct, assistant pour l’arborescence des ordinateurs., message #2441852022-07-08T09:40:29+02:00entwanne/@entwannehttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244185<figure><blockquote>
<p><a href="/@NightProg" rel="nofollow" class="ping ping-link">@<span class="ping-username">NightProg</span></a> ne voulait pas utiliser <code>argparse</code> parce que la syntaxe est incompréhensible, d’abord ;
Et il a donc voulu <code>docopt</code> par sa facilité de syntaxe <em>(ce qui au final n’est à mon goût pas vraiment le cas)</em>. <code>docopt</code> est du coup, après utilisation avec pas pratique <strong>du tout</strong>.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16349/smwct-assistant-de-recherche-et-de-moderation-pour-larborescence-des-ordinateurs/?page=2#p244183">b4b4</a></figcaption></figure>
<p>Qu’il y ait une certaine marche à passer pour apprendre à l’utiliser je veux bien l’entendre, mais qu’est-ce qui rendrait la syntaxe d'<code>argparse</code> incompréhensible ?</p>
<figure><blockquote>
<p>Pour faire simple, la base du programme que tu me propose résout tout ces problèmes ? Je trouve étonnant qu’un programme entièrement basé sur la commande <code>tree</code> elle même d’Unix soit si mal faite.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16349/smwct-assistant-de-recherche-et-de-moderation-pour-larborescence-des-ordinateurs/?page=2#p244183">b4b4</a></figcaption></figure>
<p>Le lien que tu donnes n’est pas LE projet <code>tree</code> mais des propositions d’implémentation du programme dans différents langages. Le « vrai » <code>tree</code> se trouve ici : <a href="https://gitlab.com/OldManProgrammer/unix-tree">https://gitlab.com/OldManProgrammer/unix-tree</a></p>Wct, assistant pour l’arborescence des ordinateurs., message #2441832022-07-08T09:25:43+02:00Lokasku/@Lokaskuhttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244183<p>Bonjour,</p>
<blockquote>
<p>On peut critiquer l’interface de argparse qui est effectivement un peu mal fichue, mais je serais curieux des arguments de <a href="/@NightProg" rel="nofollow" class="ping ping-link">@<span class="ping-username">NightProg</span></a> pour :</p>
<ul>
<li>d’une part ne pas se servir d’argparse malgré ses défauts étant donné que c’est en gros le standard du marché et qu’il est inclus dans la lib standard de Python, à moins de se heurter à ses limitations je ne vois pas de bonne raison de s’en passer ;</li>
<li>et a fortiori préférer docopt parmi la myriade d’alternatives alors qu’elle est moins flexible qu’argparse et que son développement est complètement mort (dernier commit il y a 4 ans, dernière release il y a 8 ans, Python a bougé pas mal entre temps !).</li>
</ul>
</blockquote>
<p><a href="/@NightProg" rel="nofollow" class="ping ping-link">@<span class="ping-username">NightProg</span></a> ne voulait pas utiliser <code>argparse</code> parce que la syntaxe est incompréhensible, d’abord ;
Et il a donc voulu <code>docopt</code> par sa facilité de syntaxe <em>(ce qui au final n’est à mon goût pas vraiment le cas)</em>. <code>docopt</code> est du coup, après utilisation avec pas pratique <strong>du tout</strong>.</p>
<blockquote>
<p>Ça me parait un peu curieux comme choix, s et d ne représentent pas des opérations orthogonales, d est plutôt une action à effectuer sur le résultat de s. Par ailleurs, ~ et / ne sont que des cas particulier de path (j’ai l’impression en jettant un oeil au code que ~ est traité comme un cas spécial alors que de toute façon il sera remplacé par le shell par le chemin vers ton home avant même que python soit lancé, ton programme verra jamais un ~ à moins que celui-ci soit échappé, ce qui voudrait dire que l’utilisateur veut traiter un dossier qui s’appelle littéralement ~ !).</p>
</blockquote>
<p>Tu as tout à fait raison, je vais retirer <code>d</code> et ajouter un argument <code>--delete</code>. Pour ce qui est des arguments <code>~</code> et <code>/</code> je les traites comme des cas spéciaux et c’est peut être pour ça qu’ils ne fonctionne pas. Je vais simplement traiter <code><path></code> par la suite.</p>
<blockquote>
<p>beaucoup d’appels à pathlib.Path (souvent sur un truc qui est déjà un Path !) au lieu de ne manipuler que des Path directement ;</p>
<ul>
<li>les appels inlines à set_satistics qui font des appels systèmes pour vérifier des trucs qui ont déjà été testés par ailleurs ;</li>
<li>la gymnastique coûteuse pour enlever WindowsPath de str(tup) (ça n’a rien à faire là d’ailleurs) alors que pathlib gère déjà tout ça correctement ;</li>
<li>le plus gros problème je pense (sans profiler on peut se planter) est l’appel sorted([path for path in os.listdir(directory)]) puis itérer sur ces trucs, c’est un problème pour plusieurs raisons:
<ul>
<li>il y a trois grosses listes qui sont crées au lieu de zéro si on utilise un itérateur comme dans mon implémentation ;</li>
<li>trier la liste de tous les fichiers coûte cher, pour trier la sortie, autant ne trier que le résultat de la recherche ;</li>
<li>parcourir le système de fichier dans cet ordre arbitraire sera plus lent que de suivre les inodes dans l’ordre ;</li>
<li>il y a des conversions entre pathlib, str (pour le tri) et la représentation interne de os.path sur tous le chemins (c’est aussi sûrement la raison pour laquelle vous avez saupoudré le code d’appels à pathlib.Path…) ;</li>
</ul>
</li>
<li>c’est mineur par rapport aux autres points, mais itérer ensuite sur la liste via un index au lieu de la liste elle même coûte plus cher (à cause des accès en Python au lieu d’avoir des appels en C directement dans l’itérateur de la libstandard).</li>
<li>enfin, tant que l’exploration elle-même sera faite directement en Python plutôt que se reposer au maximum sur des implémentations bas niveau (comme pathlib.Path.glob), vous allez forcément perdre en performances. On peut espérer que les appels au filesystem masquent les coûts de la VM Python, mais j’en suis pas convaincu à priori (par contre, ce qu’il y a de sûr, c’est que les perfs du filesystem dépendent énormément de ce qu’il y a en cache, surtout sous Linux qui est beaucoup plus aggressif sur le cache que Windows).</li>
</ul>
</blockquote>
<p>Pour faire simple, la base du programme que tu me propose résout tout ces problèmes ? Je trouve étonnant qu’un programme entièrement basé sur la commande <code>tree</code> elle même d’Unix soit si mal faite.</p>
<p>Cordialement <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"> .</p>Wct, assistant pour l’arborescence des ordinateurs., message #2441772022-07-07T20:19:22+02:00adri1/@adri1https://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244177<p>Salut,</p>
<blockquote>
<p>Pour commencer, suite à vos recommandations nous avons, <a href="/@NightProg" rel="nofollow" class="ping ping-link">@<span class="ping-username">NightProg</span></a> et moi, remplacé le module <code>os</code> par <code>pathlib</code> (sauf pour un cas) et nos commandes autrefois gérés manuellement, par le module <code>docopt</code> (j’étais partis sur <code>argparse</code> mais NightProg a sut m’en dissuader).</p>
</blockquote>
<p>On peut critiquer l’interface de <code>argparse</code> qui est effectivement un peu mal fichue, mais je serais curieux des arguments de <a href="/@NightProg" rel="nofollow" class="ping ping-link">@<span class="ping-username">NightProg</span></a> pour :</p>
<ul>
<li>d’une part ne pas se servir d’argparse malgré ses défauts étant donné que c’est en gros le standard du marché et qu’il est inclus dans la lib standard de Python, à moins de se heurter à ses limitations je ne vois pas de bonne raison de s’en passer ;</li>
<li>et <em>a fortiori</em> préférer <code>docopt</code> parmi la myriade d’alternatives alors qu’elle est moins flexible qu’argparse et que son développement est complètement mort (dernier commit il y a 4 ans, dernière release il y a 8 ans, Python a bougé pas mal entre temps !).</li>
</ul>
<blockquote>
<p>Ce qui fait que la commande fonctionne comme suit: <code>wct (s|d) (~|/|<path>) <pattern></code>. Notez que <code><pattern></code> va être remplacé pour faire place aux regex par NightProg. La commande commençant par avec <code>d</code> n’est pas encore entamé, toutefois, celle avec <code>s</code> l’est.</p>
</blockquote>
<p>Ça me parait un peu curieux comme choix, <code>s</code> et <code>d</code> ne représentent pas des opérations orthogonales, <code>d</code> est plutôt une action à effectuer sur le résultat de <code>s</code>. Par ailleurs, <code>~</code> et <code>/</code> ne sont que des cas particulier de <code>path</code> (j’ai l’impression en jettant un oeil au code que <code>~</code> est traité comme un cas spécial alors que de toute façon il sera remplacé par le shell par le chemin vers ton home avant même que python soit lancé, ton programme verra jamais un <code>~</code> à moins que celui-ci soit échappé, ce qui voudrait dire que l’utilisateur veut traiter un dossier qui s’appelle littéralement <code>~</code> !).</p>
<blockquote>
<p>Dernièrement, nous avons essayé de mettre le paquet en ligne mais ça n’a pas marché, alors nous ne savons à vrai dire pas vraiment comment faire.</p>
</blockquote>
<p>Avec <a href="https://zestedesavoir.com/forums/sujet/16349/smwct-assistant-de-recherche-et-de-moderation-pour-larborescence-des-ordinateurs/?page=1#p244031">l’exemple clé en main que j’ai fourni</a> il n’y a plus qu’à créer un compte sur <code>pypi</code> et créer la wheel et l’uploader avec <code>python3 -m build</code> puis <code>python3 -m twine upload dist/*</code>.</p>
<blockquote>
<p>Le logiciel est vraiment loin derrière <code>find</code> ou même <code>fd</code>, même si je suis quand même satisfait de ce qu’il fait. C’est pourquoi je vous invite à nous partager vos idée pour raccourcir le plus possible le temps de recherche. Nous avons déjà noté les suivantes :</p>
<ul>
<li>Outrepasser les dossiers commençant par <code>.</code>, qui sont nombreux et peu intéressant;</li>
<li>Sauter les dossiers ayant un accès restreint (a été développé le 07/07/2022) au lieu d’essayer de rentrer dedans;</li>
<li>Passer outre les dossiers qui n’ont absolument aucune importance tels que <code>__pycache__/</code>, <code>build/</code>, <code>venv/</code>, <code>.env</code>, <code>doc/</code>, <code>llvm/</code>, <code>dist/</code>, etc.</li>
</ul>
</blockquote>
<p>L’implémentation de <code>explorer</code> est encore ultra-compliquée ! <a href="https://zestedesavoir.com/forums/sujet/16349/smwct-assistant-de-recherche-et-de-moderation-pour-larborescence-des-ordinateurs/?page=2#p244083">Surtout par rapport à l’alternative que je propose</a> (à savoir utiliser <code>path.glob</code> massivement). En vrac en parcourant le code :</p>
<ul>
<li>beaucoup d’appels à <code>pathlib.Path</code> (souvent sur un truc qui est déjà un <code>Path</code> !) au lieu de ne manipuler que des <code>Path</code> directement ;</li>
<li>les appels inlines à <code>set_satistics</code> qui font des appels systèmes pour vérifier des trucs qui ont déjà été testés par ailleurs ;</li>
<li>la gymnastique coûteuse pour enlever <code>WindowsPath</code> de <code>str(tup)</code> (ça n’a rien à faire là d’ailleurs) alors que <code>pathlib</code> gère déjà tout ça correctement ;</li>
<li>le plus gros problème je pense (sans profiler on peut se planter) est l’appel <code>sorted([path for path in os.listdir(directory)])</code> puis itérer sur ces trucs, c’est un problème pour plusieurs raisons:
<ul>
<li>il y a <em>trois</em> grosses listes qui sont crées au lieu de zéro si on utilise un itérateur comme dans mon implémentation ;</li>
<li>trier la liste de <em>tous les fichiers</em> coûte cher, pour trier la sortie, autant ne trier que le résultat de la recherche ;</li>
<li>parcourir le système de fichier dans cet ordre arbitraire sera plus lent que de suivre les inodes dans l’ordre ;</li>
<li>il y a des conversions entre pathlib, str (pour le tri) et la représentation interne de <code>os.path</code> sur tous le chemins (c’est aussi sûrement la raison pour laquelle vous avez saupoudré le code d’appels à <code>pathlib.Path</code>…) ;</li>
<li>c’est mineur par rapport aux autres points, mais itérer ensuite sur la liste via un <code>index</code> au lieu de la liste elle même coûte plus cher (à cause des accès en Python au lieu d’avoir des appels en C directement dans l’itérateur de la libstandard).</li>
</ul>
</li>
<li>enfin, tant que l’exploration elle-même sera faite directement en Python plutôt que se reposer au maximum sur des implémentations bas niveau (comme <code>pathlib.Path.glob</code>), vous allez forcément perdre en performances. On peut espérer que les appels au filesystem masquent les coûts de la VM Python, mais j’en suis pas convaincu à priori (par contre, ce qu’il y a de sûr, c’est que les perfs du filesystem dépendent énormément de ce qu’il y a en cache, surtout sous Linux qui est beaucoup plus aggressif sur le cache que Windows).</li>
</ul>
<blockquote>
<p>Voilà un aperçu de l’utilisation du logiciel :</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span></div><pre><code class="hljs language-text">$ cd Documents/dev/wct
$ python wct.py s /home/b4b4/Documents/dev/wct re
</code></pre></div>
</blockquote>
<p>Si tu es déjà dans le répertoire <code>~/Documents/dev/wct</code>, tu peux juste appeler <code>python wct.py s . re</code> au lieu de réécrire le path complètement (si c’est pas le cas, c’est qu’il y a un problème dans la transformation de l’argument en <code>Path</code>).</p>Wct, assistant pour l’arborescence des ordinateurs., message #2441752022-07-07T19:30:24+02:00Lokasku/@Lokaskuhttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244175<figure><blockquote>
<p>Les dossiers masqués, ceux commençant par <code>.</code>, sont justement ceux où on trouve le plus de vieux fichiers de configurations, alors ça me paraitrait bizarre de les ignorer. Par ailleurs, est-ce que le programme détecte les dossiers qui correspondent au pattern ? Si je veux supprimer les fichiers de <code>truc</code>, et qu’il y a un dossier <code>.truc</code> mais qui contient uniquement des fichiers nommés par exemple <code>conf.txt</code>, je veux que le dossier <code>.truc</code> apparaisse.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16349/smwct-assistant-de-recherche-et-de-moderation-pour-larborescence-des-ordinateurs/?page=2#p244173">Moté</a></figcaption></figure>
<p>Oui, tout à fait. Si <em>Wcd</em> passe sur un item quel qui soit qui match avec le pattern il l’ajoute dans une liste nommé <code>target_list</code>, et c’est cette liste que le logiciel vous retourne (donc le chemin menant à X dossier / fichier qui correspond au <code>pattern</code>).</p>
<figure><img src="/media/galleries/18111/b9bed10b-5a72-4c0d-9aff-5cde261b0ba7.png" alt="Wct en action avec une requête commeçant par un point"><figcaption>Wct en action avec une requête commeçant par un point</figcaption></figure>
<p>Pour information, il a fallut <strong>18.67 secondes</strong> à Wct pour fouiller tout le répertoire <code>/home/b4b4/</code>.</p>Wct, assistant pour l’arborescence des ordinateurs., message #2441732022-07-07T19:08:46+02:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244173<p>Les dossiers masqués, ceux commençant par <code>.</code>, sont justement ceux où on trouve le plus de vieux fichiers de configurations, alors ça me paraitrait bizarre de les ignorer. Par ailleurs, est-ce que le programme détecte les dossiers qui correspondent au pattern ? Si je veux supprimer les fichiers de <code>truc</code>, et qu’il y a un dossier <code>.truc</code> mais qui contient uniquement des fichiers nommés par exemple <code>conf.txt</code>, je veux que le dossier <code>.truc</code> apparaisse.</p>Wct, assistant pour l’arborescence des ordinateurs., message #2441722022-07-07T18:20:33+02:00Lokasku/@Lokaskuhttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244172<p>Bonsoir <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"> ,</p>
<p><em>Smwct</em> a bien évolué depuis sa dernière présentation, d’ailleurs, il s’appel maintenant <em>Wct</em> qui est un raccourcis encore plus poussé, à savoir "<em>Wizard for the Computer Tree</em>". Mais rassurez il n’y a pas que le nom qui a changé. Je vous présente ici toutes les évolutions du projet.</p>
<p>Pour commencer, suite à vos recommandations nous avons, <a href="/@NightProg" rel="nofollow" class="ping ping-link">@<span class="ping-username">NightProg</span></a> et moi, remplacé le module <code>os</code> par <code>pathlib</code> (sauf pour un cas) et nos commandes autrefois gérés manuellement, par le module <code>docopt</code> (j’étais partis sur <code>argparse</code> mais NightProg a sut m’en dissuader). Ce qui fait que la commande fonctionne comme suit: <code>wct (s|d) (~|/|<path>) <pattern></code>. Notez que <code><pattern></code> va être remplacé pour faire place aux regex par NightProg. La commande commençant par avec <code>d</code> n’est pas encore entamé, toutefois, celle avec <code>s</code> l’est.</p>
<p>Ensuite, l'<a href="https://github.com/b4-b4/wct/blob/main/src/module/explorer.py">explorateur</a> est fonctionnel, nous l’avons testé sur Windows, MacOS et Linux. Etant le coeur du projet <em>Wct</em>, j’ai mis environ 5 jours pour le développer correctement. Ce dernier est basé sur le programme de la commande <code>tree</code> elle même, ce qui veut dire que je me suis servis de la technique de déplacement de <code>tree</code> pour faire celui de <code>wct</code>. Vous pouvez trouver <a href="https://github.com/kddnewton/tree/blob/main/tree.py">ici</a> le code de la commande <code>tree</code> sur Unix (dont je me suis servis).</p>
<p>Dernièrement, nous avons essayé de mettre le paquet en ligne mais ça n’a pas marché, alors nous ne savons à vrai dire pas vraiment comment faire.</p>
<p>Le logiciel est vraiment loin derrière <code>find</code> ou même <code>fd</code>, même si je suis quand même satisfait de ce qu’il fait. C’est pourquoi je vous invite à nous partager vos idée pour raccourcir le plus possible le temps de recherche. Nous avons déjà noté les suivantes :</p>
<ul>
<li>Outrepasser les dossiers commençant par <code>.</code>, qui sont nombreux et peu intéressant;</li>
<li>Sauter les dossiers ayant un accès restreint (a été développé le 07/07/2022) au lieu d’essayer de rentrer dedans;</li>
<li>Passer outre les dossiers qui n’ont absolument aucune importance tels que <code>__pycache__/</code>, <code>build/</code>, <code>venv/</code>, <code>.env</code>, <code>doc/</code>, <code>llvm/</code>, <code>dist/</code>, etc.</li>
</ul>
<p>Voilà un aperçu de l’utilisation du logiciel :</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span></div><pre><code class="hljs language-text">$ cd Documents/dev/wct
$ python wct.py s /home/b4b4/Documents/dev/wct re
121 folders, 167 files.
~ /home/b4b4/Documents/dev/wct/.git/hooks/pre-applypatch.sample
~ /home/b4b4/Documents/dev/wct/.git/hooks/pre-commit.sample
~ /home/b4b4/Documents/dev/wct/.git/hooks/pre-merge-commit.sample
~ /home/b4b4/Documents/dev/wct/.git/hooks/pre-push.sample
~ /home/b4b4/Documents/dev/wct/.git/hooks/pre-rebase.sample
~ /home/b4b4/Documents/dev/wct/.git/hooks/pre-receive.sample
~ /home/b4b4/Documents/dev/wct/.git/hooks/prepare-commit-msg.sample
~ /home/b4b4/Documents/dev/wct/.git/logs/refs
~ /home/b4b4/Documents/dev/wct/.git/logs/refs/heads/repackaging
~ /home/b4b4/Documents/dev/wct/.git/logs/refs/remotes
~ /home/b4b4/Documents/dev/wct/.git/packed-refs
~ /home/b4b4/Documents/dev/wct/.git/refs
~ /home/b4b4/Documents/dev/wct/.git/refs/heads/repackaging
~ /home/b4b4/Documents/dev/wct/.git/refs/remotes
~ /home/b4b4/Documents/dev/wct/.gitignore
~ /home/b4b4/Documents/dev/wct/src/module/__pycache__/explorer.cpython-310.pyc
~ /home/b4b4/Documents/dev/wct/src/module/__pycache__/ignore_analysis.cpython-310.pyc
~ /home/b4b4/Documents/dev/wct/src/module/explorer.py
[ 0.02940511703491211 seconds. ]
</code></pre></div>
<div class="custom-block custom-block-information"><div class="custom-block-heading">Note</div><div class="custom-block-body"><p><code>121 folders, 167 files</code> correspond bien au nombres de dossiers et fichiers visités par l’explorateur, pas ceux trouvés.</p></div></div>
<p>La description des avancés est terminé et j’aimerais toutefois vous rappeler que <a href="https://github.com/b4-b4/wct/">le projet est open source</a> et qu’il n’attend que que vous le <em>forkiez</em> puis <em>cloniez</em> pour l’améliorer. NightProg et moi n’iront vraiment pas loin si nous le faisons qu’à deux. <a href="https://github.com/b4-b4/wct/">Rejoignez le projet !</a>.</p>
<p>Cordialement, l’aimable auteur du logiciel <em>Wct</em>.</p>Wct, assistant pour l’arborescence des ordinateurs., message #2440842022-07-04T16:45:40+02:00sgble/@sgblehttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244084<p>Il faut être prudent avec l’appel <code>chdir</code>, quelque soit le langage. Ça change le repertoire courant pour <em>l’ensemble du processus</em> (du moins sous Linux), ce qui induit des problèmes évidents de cohérence quand plusieurs unités d’exécution concurrentes (thread, coroutine, greenlet, …) parcourent « leur » repertoire courant.</p>
<p>C’est en général le truc qu’on appelle une seule fois au tout début pour avoir une référence (dans le cas où l’outil ne permet pas ou ne rend pas obligatoire d’indiquer explicitement un repertoire de travail). Ensuite, on ne l’appelle plus du tout car ce n’est pas nécessaire puisqu’on se sert de l’arborescence pour pouvoir tout parcourir à sa guise. Le module <code>pahtlib</code> permet cela.</p>Wct, assistant pour l’arborescence des ordinateurs., message #2440832022-07-04T15:22:56+02:00adri1/@adri1https://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244083<p>Il n’y a aucune raison valable de se passer de <code>pathlib</code> dans du nouveau code. <code>os.path</code> est une vieille abstraction pas super bien faite.</p>
<p>L’algo utilisé est horriblement complexe. Déjà, utiliser <code>os.chdir</code> et se baser sur <code>os.getcwd</code> pour se balader dans l’arborescence rend le truc super casse-gueule parce que ça fait un état global dont il faut se préoccuper pour suivre ce que fait l’algorithme. Ensuite, l’élément clé qu’il manque à l’algorithme que vous utilisez est qu’il doit être <em>récursif</em> d’une façon ou d’une autre. Si vous avez une fonction qui prend un chemin et un truc à trouver, et renvoie un itérateur sur les chemins qui correspondent (<code>def find(path: Path, pattern: str) -> Iterable[Path]</code>), alors à chaque fois que vous rencontrez un dossier, il suffit d’appeler cette fonction récursivement sur le dossier.</p>
<p>Codé vite fait (il y a sûrement plein de <em>corner cases</em> pénibles) :</p>
<div class="hljs-code-div hljs-code-python"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span></div><pre><code class="hljs language-python"><span class="hljs-keyword">from</span> pathlib <span class="hljs-keyword">import</span> Path
<span class="hljs-keyword">from</span> typing <span class="hljs-keyword">import</span> Iterable
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">find</span>(<span class="hljs-params">path: Path, pattern: <span class="hljs-built_in">str</span></span>) -> Iterable[Path]:</span>
<span class="hljs-keyword">for</span> subpath <span class="hljs-keyword">in</span> path.iterdir():
<span class="hljs-keyword">if</span> pattern <span class="hljs-keyword">in</span> subpath.name:
<span class="hljs-keyword">yield</span> subpath
<span class="hljs-keyword">if</span> subpath.is_dir():
<span class="hljs-keyword">yield</span> <span class="hljs-keyword">from</span> find(subpath, pattern)
</code></pre></div>
<p>Accessoirement, c’est équivalent (du moins dans l’esprit) à ce que ferait <code>path.glob(f"**/*{pattern}*")</code>.</p>Wct, assistant pour l’arborescence des ordinateurs., message #2440722022-07-04T11:06:36+02:00Lokasku/@Lokaskuhttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244072<figure><blockquote>
<p>Est-ce que tu as regardé du côté de pathlib, comme adri1 te l’a conseillé sur la page précédente ?</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16349/smwct-assistant-de-recherche-et-de-moderation-pour-larborescence-des-ordinateurs/?page=2#p244067">Moté</a></figcaption></figure>
<p>Oui, on a l’intention de remplacer en partie <code>os</code> par <code>pathlib</code>, une fois que l’explorateur sera terminé (ce sera d’ailleurs <a href="/@NightProg" rel="nofollow" class="ping ping-link">@<span class="ping-username">NightProg</span></a> qui s’en occupera).</p>Wct, assistant pour l’arborescence des ordinateurs., message #2440672022-07-04T10:00:25+02:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244067<p>Est-ce que tu as regardé du côté de pathlib, comme adri1 te l’a conseillé sur la page précédente ?</p>Wct, assistant pour l’arborescence des ordinateurs., message #2440652022-07-04T09:18:54+02:00Lokasku/@Lokaskuhttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244065<p>Bonjour,</p>
<p>J’ai il y a peu entamé le fameux algorithme d’exploration de dossier du projet <em>Smwct</em>, mais il s’avère que ma méthode est mauvaise. Jusqu’à présent, je procédais de la façon suivante :</p>
<ol>
<li>Définition de la variable <code>target_path</code> qui contiendrai les chemins correspondants à la chaîne envoyé par l’utilisateur. Définition de <code>visited_path</code> qui contiendrai les chemins visité (si c’était un dossier) ou simplement déjà itéré (un fichier). Déclaration de <code>starting_path</code> qui contient le chemin de départ (donc est relatif en fonction de <code>--session</code> ou <code>--root</code>) et enfin dernièrement la variable <code>current_folder</code> qui contient le dossier dans lequel on est pour gérer où itérer.</li>
<li>Ensuite, je déclarai une boucle <code>while True</code> dans laquelle je mettais <code>for item in os.listdir(current_folder)</code> : une boucle qui itère sur tous les éléments du dossier actuel. Dans celle-ci il devrait y avoir ceci d’important:</li>
</ol>
<ul>
<li>Condition n°1: Si la chaîne de caractère demandé est dans l’item du dossier courant, alors l’ajouter à la liste <code>target_value</code>.</li>
<li>Condition n°2: Si l’item sur lequel je suis n’est pas dans ma liste <code>visited_path</code>, alors je l’y ajoute, et si celui-ci est en plus de ça un dossier, alors j’entre dedans en changeant la valeur de <code>current_folder</code> à celle du nouveau dossier <em>(avec <code>os.chdir(item_path)</code>, <code>item_path</code> qui je ne vous l’ai pas dis, contient le chemin menant vers l’item courant)</em>. Je finis avec la valeur <code>continue</code> qui veut dire que je souhaite passer directement à l’itération suivante.</li>
<li>Si l’item courant est le dernier du répertoire courant, alors je me déplace dans le répertoire précédant <em>(à l’aide de <code>os.chdir("../")</code>)</em> en changeant à nouveau la valeur de <code>current_path</code> après coût avec <code>os.getcwd()</code> => Get Current Working Directory. Je finis encore une fois avec la valeur <code>continue</code>.</li>
<li>Pour finir, Si l’item est le dernier du répertoire courant, et que le dossier courant est celui de <code>starting_path</code> (donc celui initial, alors je m’arrête).</li>
</ul>
<p>Le problème de ce programme étant qu’il est imbriqué de la manière suivante :</p>
<div class="hljs-code-div hljs-code-py"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span></div><pre><code class="hljs language-py"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">x</span>():</span>
<span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> y:
<span class="hljs-keyword">if</span> x:
<span class="hljs-keyword">continue</span> <span class="hljs-comment"># Nous ramène en faite seulement à la prochaîne itération sans prendre en compte le changement de current_path. Ce qui fait que si on tombe sur un dossier non visité, on aura beau entrer dedans, on y sera réellement uniquement quand tous les élément du dossier qui était courant seront parcouru.</span>
</code></pre></div>
<p>J’aimerai que vous me suggériez un nouveau mode de fonctionnement ou de grandes amélioration pour cette partie du programme, vous pouvez aussi rejoindre le projet qui je le rappel, est open-source et est en ce moment même développé par moi et <a href="/@NightProg" rel="nofollow" class="ping ping-link">@<span class="ping-username">NightProg</span></a>.</p>
<p>Cordialement.</p>Wct, assistant pour l’arborescence des ordinateurs., message #2440542022-07-03T15:36:10+02:00adri1/@adri1https://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244054<blockquote>
<p>Je n’y avais pas pensé, mais en effet <code>/</code> à la place de <code>--root</code> serait une bonne chose. Idem pour <code>--session</code> qui pourrait être remplacé par <code>~</code>. Je vais l’implémenter à smwct.</p>
</blockquote>
<p>Note que <code>~</code> sera automatiquement remplacé par l’emplacement de ton home par le shell. Donc en fait tout ce que tu as à gérer est d’avoir un chemin comme argument positionnel.</p>
<blockquote>
<p>"thing" représente un "match partiel"</p>
</blockquote>
<p>Au cas où c’était pas clair, je me mettais dans la peau de quelqu’un qui ne connait rien au projet et voit la commande, elle est surprenante par plusieurs aspects. D’ailleurs tant qu’on est à discuter les conventions de CLI, j’ai l’impression que tu demandes à ce que l’ordre <code>-s --(root|session) <thing></code> soit respecté, faisant effectivement de <code>-s</code> et <code>--(root|session)</code> des arguments positionnels et obligatoires. Or, par convention les arguments en <code>--arg</code> ou <code>-a</code> sont optionnels et leur ordre n’a pas d’importance. <code>-s</code> devrait être une sous-commande qui serait simplement <code>s</code>, et comme on l’a déjà discuté <code>--(root|session)</code> serait plutôt un path. Ça te donne une commande du genre <code>smwct s <path> <thing></code>.</p>
<p>Par ailleurs, plutôt que de parser les arguments à la main, tu devrais utiliser <a href="https://docs.python.org/3/library/argparse.html"><code>argparse</code></a>.</p>Wct, assistant pour l’arborescence des ordinateurs., message #2440532022-07-03T15:25:51+02:00Lokasku/@Lokaskuhttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244053<p>Je n’y avais pas pensé, mais en effet <code>/</code> à la place de <code>--root</code> serait une bonne chose. Idem pour <code>--session</code> qui pourrait être remplacé par <code>~</code>. Je vais l’implémenter à <em>smwct</em>.</p>
<blockquote>
<p>Avec ta commande, on sait pas trop ce que —session veut dire, et on sait pas trop ce que thing représente comme requête : un nom qui matche parfaitement ou bien un match partiel</p>
</blockquote>
<p>"<em>thing</em>" représente un "match partiel". Pour mieux comprendre, ça correspondrait à ça :</p>
<div class="hljs-code-div hljs-code-py"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span></div><pre><code class="hljs language-py"><span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> os.listdiv():
<span class="hljs-keyword">if</span> sys.argv[<span class="hljs-number">3</span>] <span class="hljs-keyword">in</span> item: <span class="hljs-comment"># sys.argv[3] correspondrait à "thing"</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">f'<span class="hljs-subst">{sys.argv[<span class="hljs-number">3</span>] est dans {item}</span>.'</span>)
</code></pre></div>Wct, assistant pour l’arborescence des ordinateurs., message #2440512022-07-03T15:21:14+02:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244051<p>Surtout que logiquement, ta fonction de recherche doit pouvoir prendre en paramètre un dossier arbitraire, sinon c’est qu’il y a une conception bizarre. Et tu as juste à modifier la façon de récupérer l’argument, ce qui est normalement assez simple.</p>Wct, assistant pour l’arborescence des ordinateurs., message #2440502022-07-03T15:00:51+02:00adri1/@adri1https://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=2#p244050<blockquote>
<p>On revient un peu au problème d’origine à savoir que c’est pénible de chercher un élément dans une myriade de répertoire</p>
</blockquote>
<p>Honnêtement je suis pas sûr de suivre ce que tu veux dire par là. Tu veux dire avec <code>find</code> ? Ta commande <code>smwct -s --session thing</code> est équivalente à <code>find ~ -name "*thing*"</code> (si j’ai bien compris ce que <code>smwct</code> est censé faire). Je ne sais pas laquelle est la "mieux" dans l’absolu, mais je sais tout de suite comment modifier la commande <code>find</code> pour chercher dans <code>/</code> : <code>find / -name "*thing*"</code>, et le pattern accepté est dans un format suffisamment standard pour pouvoir lire ce qui se passe ainsi que pouvoir le modifier facilement. Avec ta commande, on sait pas trop ce que <code>--session</code> veut dire, et on sait pas trop ce que <code>thing</code> représente comme requête : un nom qui matche parfaitement ou bien un match partiel ? On fait comment pour avoir l’autre ? <code>find</code> peut devenir rapidement très pénible à utiliser lorsque les requêtes se complexifient, mais certaines choses sont extrêmement standard sur Linux. Typiquement, lorsque tu as une commande qui explore le système de fichiers, t’as globalement trois possibilités.</p>
<ul>
<li>La commande est bête comme chou et s’exécute dans le répertoire courant, point barre. C’est un peu le niveau zéro de ce qu’on peut faire, mais ça se compose facilement avec <code>cd</code> dans le shell (mais ça suppose de créer un sous-shell dans les scripts, c’est pas forcément super).</li>
<li>La commande cherche un ensemble standard et connu, typiquement dans une variable d’environnement (type <code>$PATH</code> comme ce que fait <code>whereis</code>), c’est bien pour tout ce qui est censé interagir avec un environnement donné pour chercher e.g. les exécutables et librairies là où il est standard de le faire.</li>
<li>La commande accepte un chemin arbitraire, c’est parfait lorsque la commande se veut un peu tout terrain. Note que pas mal de commandes qui par défaut agissent dans le répertoire courant (e.g. <code>git</code>) ou d’après des variables d’environnement (e.g. <code>whereis</code>) sont aussi capables de prendre des chemins arbitraires. C’est la façon la plus simple, générique, et fiable de gérer tous les cas d’usages bizarres qui peuvent survenir. Il est pas rare sous Linux de créer des environnements locaux sur un coin de disque pour tester quelque chose, auquel cas chercher arbitrairement dans <code>$HOME</code> au lieu de cet environnement local n’est pas très utile.</li>
</ul>
<p>Dans ton cas, le truc qui demande le moins d’efforts de développement et qui t’assure l’UI la moins surprenante est de bêtement prendre un chemin arbitraire comme racine pour la recherche. Tu couvres de façon évidente les cas classiques de chercher dans <code>/</code> et dans <code>~</code> d’une façon beaucoup plus transparente et courte qu’avec <code>--root</code> ou <code>--session</code>, et tu gères gratuitement n’importe quel autre cas qui pourrait être utile à l’utilisateur.</p>Wct, assistant pour l’arborescence des ordinateurs., message #2440482022-07-03T14:13:16+02:00sgble/@sgblehttps://zestedesavoir.com/forums/sujet/16349/wct-assistant-pour-larborescence-des-ordinateurs/?page=1#p244048<p>Le cas d’usage sembler en effet exister, j’ai l’impression que c’est un peu ce que fait la commande <code>whereis</code> qui cherche dans des répertoires stratégiques, mais à condition qu’on ait un pattern exact à lui donner.</p>
<p>Par exemple :</p>
<div class="hljs-code-div hljs-code-console"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span></div><pre><code class="language-console">% whereis ffmpeg
ffmpeg: /usr/bin/ffmpeg /usr/include/ffmpeg /usr/share/ffmpeg /usr/share/man/man1/ffmpeg.1.gz
</code></pre></div>
<p>Il trouve le programme, les libs source, les pages du manuel, … Mais le tien a l’air plus général.</p>