Уведомления

Группа в Telegram: @pythonsu

#1 Март 21, 2013 16:11:17

tbazadaykin
Зарегистрирован: 2013-03-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess.call()

Сначала предыстория.
В линуксе есть утилита find. У нее есть параметр -exec который позволяет для каждого выбранного файла выполнить команду. Например пишем:

find *.flv \( -type f -o -type l \) -newermt '7/01/2012' -and -not -newermt '7/31/2012' -exec rm -v {} \;
Она найдет все файлы flv с датой изменения между 1 и 31 июля и удаляет каждый найденный.

Теперь история.
Есть у меня скрипт который делает пакетную обработку файлов (т.е. много файлов разом). Мне надо дать возможность при вызове этого скрипта выполнить команду (по аналогии с вышеприведенным примером) для каждого файла в случае успешной обработки файла, и в случае неудачной обработки. Например:
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

Не нравится что параметры –on_sucess и –on_faild приходится передавать строками. Вот как бы сделать что бы не строками?

Офлайн

#2 Март 21, 2013 18:16:01

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

subprocess.call()

почитайте про argparse. Но в общем случае необходимо продумать входной язык

python my_script.py --on_sucess 'rm --on_sucess %s' --on_faild ...
Как вы в этом случае при отсутствии кавычек будете отличать опции вызываемой команды от опций my_script.py ?

Может вам просто xargs поможет?

Ну и собственно зачем вам find написанный на питоне? Не проще просто find использовать?



Отредактировано doza_and (Март 21, 2013 18:17:32)

Офлайн

#3 Март 21, 2013 19:35:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9742
Репутация: +  843  -
Профиль   Отправить e-mail  

subprocess.call()

doza_and
Не проще просто find использовать?
там, похоже, кроссплатформенный скрипт

tbazadaykin
Не нравится что параметры –on_sucess и –on_faild приходится передавать строками.
да вообще, из командной строки не должно быть способа влиять на внутренности скрипта, это же что-то вроде eval() получается

tbazadaykin
echo "Faild"
а что такое “Faild” ? имелось в виду “failed” ?

зарегистрируй лучше определённые команды, а параметр к команде подавай отдельной опцией



Офлайн

#4 Март 21, 2013 20:14:13

tbazadaykin
Зарегистрирован: 2013-03-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess.call()

doza_and
Ну и собственно зачем вам find написанный на питоне? Не проще просто find использовать?
find просто в качестве примера того как хотелось бы реализовать вызов команд, my_script.py не дублирует функционал find.

py.user.next
а что такое “Faild” ? имелось в виду “failed” ?
Да, разумеется. Опечатался.

doza_and
Как вы в этом случае при отсутствии кавычек будете отличать опции вызываемой команды от опций my_script.py ?
Ну find же отличает как-то.

Офлайн

#5 Март 21, 2013 21:05:37

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

subprocess.call()

tbazadaykin
Ну find же отличает как-то.
У него предопределенные имена опций. Но при этом find внутри find не вызовешь.
За словами потерялось
посмотрите:
http://docs.python.org/dev/library/argparse.html



Офлайн

#6 Март 21, 2013 23:44:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9742
Репутация: +  843  -
Профиль   Отправить e-mail  

subprocess.call()

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)

Офлайн

#7 Март 22, 2013 12:01:25

tbazadaykin
Зарегистрирован: 2013-03-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess.call()

Собственно, обратившись к справке по find стало понятно как он вычленяет команду и ее параметры:

-exec command ;
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…
Теперь осталось понять как это реализовать при помощи argparse.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version