2010-09-22 3 views
25

Я хочу извлечь архив 7-Zip в сценарии Python. Он отлично работает, за исключением того, что он выплевывает детали извлечения (что в моем случае огромно).Извлечение 7-Zip-файла «молча» - опция командной строки

Есть ли способ избежать этой подробной информации при извлечении? Я не нашел ни одной «бесшумной» опции командной строки до 7z.exe.

Моя команда

7z.exe -o some_dir x some_archive.7z 

ответ

9

Одной из возможностей было бы породить дочерний процесс с popen, поэтому его выход вернется к родителю для обработки/отображения (если это необходимо), либо полностью игнорируются (создание ваш объект popen с stdout=PIPE и stderr=PIPE, чтобы иметь возможность получать выходные данные от ребенка).

+0

Спасибо. Это помогло. Я попробовал subprocess.Popen. Но затем мой родительский процесс выполняется до возвращения ребенка. Прежде чем продолжить, я хочу проверить код возврата ребенка. Я просматриваю документы, но дайте мне знать, знаете ли вы, как спрятаться (особенно с stdout = PIPE). – sambha

+0

Получил это. popen.communicate – sambha

+2

Что такое эквивалентное решение для Windows? http: //stackoverflow.com/questions/5966063/redirect-7-zips-command-line-output-to-dev-null-on-windows-when-extracting-a-7z ... –

33

Я просто натолкнулся на это, ища то же самое, но я решил это сам! Если предположить, что команда обрабатывается с Windows/DOS, более простое решение, чтобы изменить команду:

7z.exe -o some_dir x some_archive.7z > nul 

То есть прямой выход на нулевой файл, а не на экране.

Или вы можете перенаправить вывод в DOS «найти» команда только выходные конкретных данных, то есть,

7z.exe -o some_dir x some_archive.7z | FIND "ing archive" 

Это просто приведет к следующему выходу.

Создание архива some_archive.7z

или

Обновление архива some_archive.7z **


Мое окончательное решение было изменить команду

... some_archive.7z | FIND /V "ing " 

Примечание пробел после слова 'ing'. Это привело к следующему результату.

7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 

Scanning 

Updating some_archive.7z 


Everything is Ok 

Это удаляет отдельную обработку файлов, но дает сводную информацию об общей операции, независимо от типа операции.

+1

приятное решение. если вы не любите Игоря, как я, вы можете удалить сам тоже: «... some_archive.7z | FIND/V "ing" | НАЙТИ/В "Игорь Павлов" – mles

2

| FIND - хорошая альтернатива, чтобы показать, что произошло, не отображая незначительный текст.

5

Как они сказали, чтобы скрыть большинство сообщений, заполняющих экран, которые вы могли бы использовать ... some_archive.7z | FIND/V «Сжатие», но «FIND» также удалит сообщения об ошибках с этим словом. Вы не будете предупреждены. Возможно, что «FIND» также может быть изменен из-за более новой версии с 7-значным именем.

7-zip имеет принудительный многословный выход, без режима молчания, смешивает stderr и stdout (*), не сохраняет разрешения Unix и т. Д. Эти антистандартные поведения вместе помещают «7-zip» в плохое место например, при сравнении с «tar + bzip2» или «zip».

(*) «Upstream (Игорь Павлов) не хочет, чтобы сделать различные выходы для сообщений, даже если он был задан несколько раз, чтобы сделать это :(» http://us.generation-nt.com/answer/bug-346463-p7zip-stdout-stderr-help-166693561.html - «Игорь Павлов не хочет, чтобы изменить это поведение» http://sourceforge.net/tracker/?func=detail&aid=1075294&group_id=111810&atid=660493

3

7zip не имеет явного «тихий» или «тихий» режим для извлечения из командной строки.

Одной из возможностей было бы породить дочерний процесс с POPEN, поэтому его выход вернется к родителю, чтобы быть обрабатывается/отображается (при желании) или полностью игнорируется (создайте свой popen-объект с помощью stdout = PIPE и stderr = PIPE, чтобы иметь возможность получать выходные данные от ребенка).

В противном случае Попробуйте сделать это:

%COMSPEC% /c "%ProgramFiles%\7-Zip\7z.exe" ... 
3

Расширяющихся на ответ @Matthew «s и этот ответ https://superuser.com/questions/194659/how-to-disable-the-output-of-7-zip Я использую Findstr вместо найти, так что я могу цепь несколько строк, чтобы исключить и пустые строки, а также:

7za.exe a test1.zip .\foldertozip | FINDSTR /V /R /C:"^Compressing " /C:"Igor Pavlov" /C:"^Scanning$" /C:"^$" /C:"^Everything is Ok$" 
  • /В: исключить
  • /Р: регулярное выражение
  • /C: "^ Сжатие": Начальный линии, Сжимая, 2 места
  • /C: "^ Scanning $": слово Сканирование по своей собственной на линии (Начальный/конец)
  • /C:»^$ ": начало и конец без чего-либо между ними, т. е. пустая строка

Я использую/C так, чтобы пространство было пространством, в противном случае это разделитель между несколькими словами для исключения, как в этом простой вариант:

FINDSTR /V "Compressing Pavlov Scanning Everytyhing" 

(существуют одни и те же оговорки, если формулировка изменения в новой версии, или если полезный лин e начинается со слова «Сжатие», оно не будет работать, как ожидалось).

0

Если вы работаете 7-zip.exe из Powershell, и вы хотите видеть только ошибки, то вы могли бы попробовать что-то вроде этого:

7-zip.exe у | Select-String «Ошибка» -Контекст 10

Это отобразит только строку сообщения «Ошибка» и строки с ошибкой 10 (или любого другого номера), чтобы зафиксировать выходной сигнал ошибки.

Смежные вопросы