Форум сайта python.su
Сначала предыстория.
В линуксе есть утилита find. У нее есть параметр -exec который позволяет для каждого выбранного файла выполнить команду. Например пишем:
find *.flv \( -type f -o -type l \) -newermt '7/01/2012' -and -not -newermt '7/31/2012' -exec rm -v {} \;
python my_script.py --on_sucess rm -v {} --on_faild echo "Faild" /home/user/files/*.xml
from subprocess import call ... for f in arguments.source: try: process(f) if arguments.on_sucess: call(arguments.on_sucess.replace('%fn',f),shell=True) except: if arguments.on_faild: call(arguments.on_faild.replace('%fn',f),shell=True)
python my_script.py --on_sucess 'rm %fn' --on_faild 'echo "Faild %fn"' /home/usr/files/*.xml
Офлайн
почитайте про argparse. Но в общем случае необходимо продумать входной язык
python my_script.py --on_sucess 'rm --on_sucess %s' --on_faild ...
Отредактировано doza_and (Март 21, 2013 18:17:32)
Офлайн
doza_andтам, похоже, кроссплатформенный скрипт
Не проще просто find использовать?
tbazadaykinда вообще, из командной строки не должно быть способа влиять на внутренности скрипта, это же что-то вроде eval() получается
Не нравится что параметры –on_sucess и –on_faild приходится передавать строками.
tbazadaykinа что такое “Faild” ? имелось в виду “failed” ?echo "Faild"
Офлайн
doza_andfind просто в качестве примера того как хотелось бы реализовать вызов команд, my_script.py не дублирует функционал find.
Ну и собственно зачем вам find написанный на питоне? Не проще просто find использовать?
py.user.nextДа, разумеется. Опечатался.
а что такое “Faild” ? имелось в виду “failed” ?
doza_andНу find же отличает как-то.
Как вы в этом случае при отсутствии кавычек будете отличать опции вызываемой команды от опций my_script.py ?
Офлайн
tbazadaykinУ него предопределенные имена опций. Но при этом find внутри find не вызовешь.
Ну find же отличает как-то.
Офлайн
doza_and
Но при этом find внутри find не вызовешь.
[guest@localhost ~]$ find /tmp -type d -name 'orbit*'
/tmp/orbit-guest
[guest@localhost ~]$
[guest@localhost ~]$ find /tmp -type d -name 'orbit*' -exec find {} -maxdepth 1 -type f \;
/tmp/orbit-guest/bonobo-activation-server-7f729dc53f9099eabd3ff9bd514c0e94-ior
/tmp/orbit-guest/bonobo-activation-register-7f729dc53f9099eabd3ff9bd514c0e94.lock
[guest@localhost ~]$
Отредактировано py.user.next (Март 21, 2013 23:46:10)
Офлайн
Собственно, обратившись к справке по find стало понятно как он вычленяет команду и ее параметры:
-exec command ;Теперь осталось понять как это реализовать при помощи argparse.
Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of `;' is encountered. The string `{}' is replaced by the current file name being processed…
Офлайн