LINUX.ORG.RU

7z + скрипт Tcl: как прочитать stdout?

 ,


0

1

Собственно, сабж. Пишу небольшой набор обёрток для файлового архива. Есть задача: когда прохожу директорию и натыкаюсь на ZIP-архив необходимо получить список файлов в него входящих.

Данную задачу пытаюсь решить вызовом из скрипта 7z l <archive.zip> и последующим чтением stdout, но код вываливается с ошибкой «channel stdout wasn't opened for reading». Как сделать правильно?

Собственно, код (тестовый):

proc ::flc::util::zipcontent { zipfile } {
fconfigure stdout -blocking 0 -buffering none;
set zipdata [read stdout];
open «|7z l $zipfile» r;
puts «$zipdata»;
}


Ответ на: комментарий от sdio

Я не шибко хороший программист, писать надо для работы. Tcl взял ибо простой.

Про чтение stdout написано много, но больно запутанно для меня оказалось.

NIR ()
Ответ на: комментарий от sdio

При замене stdout на stdin ничего не выдаёт. Хотя и с ошибкой не вываливается. >_<

NIR ()

stdin и stdout - это собственные потоки программы, они тут ни при чём. Нужен stdout запущенной программы, а ему никакая магия имя stdout просто так не даст.

С Tcl я вообще не знаком, но тут явно нужно брать возвращаемое open значение. Пример:

$ tclsh
% open "|ls -1 | head" r 
file5
% read file5
119571.pdf
1916.pdf
2015-01-06-18-32-55.010-VirtualBox-30773.log
2015-01-06-18-34-00.094-VirtualBox-31123.log
archive
atom_heart_mother.srt
Bethesda
bgateway.reg
cdemu
ChemAxon
%

AITap ★★★★★ ()
Последнее исправление: AITap (всего исправлений: 1)
Ответ на: комментарий от AITap

Не знаком, но опередил, только немного костыльно.

2ТС: ну и с какого перепугу выхлоп 7z должен попасть в stout твоего скрипта? И зачем тебе вообще open?

set r [exec ls /]
puts $r
Suntechnic ★★★★★ ()
Ответ на: ЗАЧЕМ ???????? от MKuznetsov

Ну тут вопрос сводится еще к запуску внешних программ вообще. А так-то да.

Suntechnic ★★★★★ ()
Ответ на: ЗАЧЕМ ???????? от MKuznetsov

М-м-м. Ставил zipfile::decode:: , оно ругалось на формат архивов.

NIR ()
Ответ на: комментарий от Suntechnic

Заработало, спасибо!

Остальным тоже спасибо за варианты решений. Сейчас стоит задача запустить скрипт ASAP, но впоследствии буду пробовать разные варианты. В случае с архивами ещё есть возможность наткнуться не только на ZIP (благо пока RAR и прочие не встречались), потому выбрал именно чтение вывода 7z.

NIR ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.