Je veux extraire un 7-Zip archive dans un script Python. Cela fonctionne très bien sauf que les détails de l'extraction (ce qui est énorme dans mon cas) sont recrutés.
Existe-t-il un moyen d'éviter cette information prolixe lors de l'extraction? Je n'ai trouvé aucune option de ligne de commande "silencieuse" pour 7z.exe
.
Ma commande est
7z.exe -o some_dir x some_archive.7z
Une possibilité serait de générer le processus enfant avec popen
, afin que sa sortie revienne au parent à traiter/afficher (si vous le souhaitez) ou sinon complètement ignorée (créez votre objet popen
avec stdout=PIPE
et stderr=PIPE
récupérer la sortie de l'enfant).
Je viens juste de trouver cela en cherchant la même chose, mais je l'ai résolu moi-même! En supposant que la commande soit traitée avec Windows/DOS, une solution plus simple consiste à changer votre commande en:
7z.exe -o some_dir x some_archive.7z > nul
En d’autres termes, dirigez la sortie vers un fichier null plutôt que vers l’écran.
Ou vous pouvez diriger la sortie vers la commande "trouver" du DOS pour ne générer que des données spécifiques, c'est-à-dire:
7z.exe -o some_dir x some_archive.7z | FIND "ing archive"
Cela entraînerait simplement la sortie suivante.
Création d'archive some_archive.7z
ou
Mise à jour de l’archive some_archive.7z **
Ma dernière solution a été de changer la commande en
... some_archive.7z | FIND /V "ing "
Remarque double espace après 'ing'. Cela a abouti à la sortie suivante.
7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
Scanning
Updating some_archive.7z
Everything is Ok
Cela supprime le traitement de fichier individuel, mais produit un résumé de l'opération globale, quel que soit le type d'opération.
Comme ils l'ont dit, vous pourriez utiliser pour masquer la plupart des messages d'écran ... some_archive.7z | FIND/V "Compresser" mais que "FIND" effacerait également les messages d'erreur contenant ce mot. Vous ne seriez pas prévenu. "FIND" devra peut-être également être modifié à cause d'une version 7-Zip plus récente.
7-Zip a une sortie verbeuse forcée, pas de mode silence, mélange stderr et stdout (*), ne sauvegarde pas les autorisations Unix, etc. Ces comportements anti-standards mettent ensemble "7-Zip" au mauvais endroit par rapport à "tar + bzip2" ou "Zip", par exemple.
(*) "En amont (Igor Pavlov) ne veut pas créer de sorties différentes pour les messages, même s'il lui a été demandé à plusieurs reprises de le faire :(" http://us.generation-nt.com/answer/bug- 346463-p7Zip-stdout-stderr-help-166693561.html - "Igor Pavlov ne veut pas modifier ce comportement" http://sourceforge.net/tracker/?func=detail&aid=1075294&group_id=111810&atid=660493
Développer la réponse de @Matthew et cette réponse https://superuser.com/questions/194659/how-to-disable-the-output-of-7-Zip J'utilise FINDSTR au lieu de find pour pouvoir chaîner plusieurs lignes à exclure et les lignes vides également:
7za.exe a test1.Zip .\foldertozip | FINDSTR /V /R /C:"^Compressing " /C:"Igor Pavlov" /C:"^Scanning$" /C:"^$" /C:"^Everything is Ok$"
J'utilise/C pour qu'un espace soit un espace, sinon c'est un séparateur entre plusieurs mots à exclure comme dans cette version plus simple:
FINDSTR /V "Compressing Pavlov Scanning Everytyhing"
(les mêmes réserves existent, si le libellé change dans une nouvelle version ou si une ligne utile commence par le mot "Compression", elle ne fonctionnera pas comme prévu).
7Zip ne dispose pas d'un mode "silencieux" ou "silencieux" explicite pour l'extraction en ligne de commande.
Une possibilité serait d’engendrer le processus enfant avec popen, de sorte que sa sortie revienne au parent afin qu’elle soit traitée/affichée (si désiré) ou complètement ignorée récupérer la sortie de l'enfant).
Sinon, essayez ceci:
%COMSPEC% /c "%ProgramFiles%\7-Zip\7z.exe" ...
Le | FIND
est une bonne alternative pour montrer ce qui s'est passé sans afficher de texte insignifiant.
En examinant la source 7Zip, j'ai trouvé un commutateur -ba
caché qui semble faire l'affaire. Malheureusement ce n'est pas fini. J'ai réussi à le faire fonctionner avec plusieurs modifications de sources mais ce n'est qu'un hack. Si quelqu'un est intéressé, la variable d'option s'appelle options.EnableHeaders
et des modifications sont nécessaires dans le fichier CPP/7Zip/UI/Console/Main.cpp
..... Vous pouvez également demander à l'auteur de 7Zip de terminer la fonctionnalité dans tracker . Il y a plusieurs demandes à ce sujet et l'une d'entre elles est ici .
Si vous exécutez 7-Zip.exe à partir de Powershell et que vous voulez uniquement voir les erreurs, vous pouvez essayer quelque chose comme ceci:
7-Zip.exe u <Target> <Source> | Select-String "Error" -Context 10
Cela affichera uniquement la ligne de message "Erreur" et les 10 lignes environnantes (ou un nombre quelconque) pour capturer la sortie spécifique à l'erreur.
7-Zip n'a pas une telle option. De plus, les lignes imprimées sur chaque fichier compressé sont supposées s'afficher au même endroit sans nouvelle ligne, ce qui efface la précédente, ce qui a un effet cool. Malheureusement, dans certains contextes (Jenkins ...), plusieurs lignes sont apparues, inondant la console.
NUL
(windows) est peut-être une solution.
7-Zip.exe -o some_dir x some_archive.7z>NUL