pomkalk 17.07.2010 21:37

PythonМожет кому пригодится!

Может этот скрипт(программка) кому ни будь пригодиться, не судите строго за пост, пишу первый раз...и за python знаком с ним третий день...

Это сделано для автоматизации некоторых действий в консоли!

+ (для новичков) не испортят случайно bashrc
+ Быстрое копирование файлов

Если велосипед извините

Предистория(Кому интересно)
Мне очень нравятся консольные приложения, и mplayer не исключение, но есть одна проблема...когда нужно включить только что скачанное кино, его имя может содержать не только название но и даты, разрешения, и другую информацию, замучаешься набирать....

Сначала я хотел сделать простой скрип, который бы выводил список всех файлов в директории под номерами(как select в bash), и оставалось бы просто ввести цифру файла и выполнялась команда
1
mlpayer FileName

где FileName имя выделенного файла...

Но тут я подумал, что кроме mplayer есть еще много программ с которыми можно так поступить!
в том числе и копирование файлов!

тогда я взялся сделать скрипт для этого, но тут я его перенес на python.


Вот что получилось

Теперь мы можем сохранить "Макросы", в домашней директории активного пользователя(/home/user/.fselect.macros), и дальше по вызову команды fselect на предоставляется возможность выбора нужного макроса, и далее список файлов в текущем каталоге, где так же цифрой мы выбираем нужный файл...далее следует выполнение макроса

Что может содержать макрос:
Просто любая баш команда
- заменится на один файл
- возможность выбрать несколько файлов
указать значение(например outputFile, например при записи через ffmpeg)


скрипт требует питоновский модуль argparse (python 2.7 уже поставляется с ним)
для этого нужно установить программу, если она не установлена
1
sudo apt-get install easy_install



далее
1
sudo easy_install argparse



ну и конечно сохранить код программы в файл fselect(или другим удобным для вас именем) и поместить его в /usr/bin/


  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/usr/bin/env python


import argparse
import os,sys
import string
import commands

macros='/home/'+os.getlogin()+'/.fselect.macros'
desc="Using simple macroses and access to files. Macros is like \"cat <file>\", </file><file> will be replace to selected file name, <files> for more than one file and <out> for output"
epil="COPYRIGHT:POMKALK. VERSION:1.1 E-MAIL:pomkalk@yahoo.com. This is the opensourse project by GNU\Linux."


def getnum(List,text="Enter the number: ",err="You have to enter the Number!",minz=1,null=False):
while 1:
try:
ans=int(raw_input(text))
if (ans&lt;minz) or (ans&gt;len(List)): raise ValueError
break
except ValueError:
if null:
return minz-1
else:
print err
print minz,"<=NUM<=",len(List)
except KeyboardInterrupt:
print "\nStopped by",os.getlogin()
sys.exit(1)
except:
print "\nFATAL ERROR"
sys.exit(0)
return ans

def add_macros(mac):

if mac.count("</out></files></file><file>")&gt;1:
print "Macros has to include one of </file><file>"
sys.exit(1)
elif mac.count("<files>")&gt;1:
print "Macros has to include one of </files><files>"
sys.exit(1)
elif (mac.count("</files></file><file>")==1) and (mac.count("<files>")==1):
print "Macros can include </files></file><file> or <files>"
sys.exit(1)
try:
f=open(macros,"a")
print&gt;&gt;f,mac
f.close()
print "Macros \""+mac+"\" is added"
except IOError:
print "Cant open macros list"
sys.exit(1)
except:
print "\nFATAL ERROR"
sys.exit(1)


def list_macros():
print "List of Macroses:"
try:
f=open(macros)
l=f.readlines()
f.close()
for i in xrange(len(l)):
print str(i+1)+")",l<i>.strip()
return l
except IOError,x:
print "NO MACROSES"
except:
print "\nFATAL ERROR"
sys.exit(1)

def remove_macros():
l=list_macros()
if (l != None) and (len(l)&gt;0):
ans=getnum(l)
else:
print "Macros list is clear"
sys.exit(0)
removed=l.pop(ans-1)
try:
f=open(macros,"w")
for i in l:
print&gt;&gt;f,i.strip()
f.close()
print removed.strip(),"is removed"
except IOError,x:
print "Error, Try again"
except:
print "\nFATAL ERROR"
sys.exit(1)


def get_dirlist(args):
lc = "ls -1"

if args.sortr: lc=lc+"r"
if args.sortt: lc=lc + "t"
elif args.sorts: lc=lc+"S"

if args.format:
lc = lc + " *." + args.format
lc = lc +" | while read i; do if < ! -d \"$i\" >; then echo \"$i\"; fi; done"
dl = commands.getoutput(lc)
dl=dl.split("\n")
if len(dl)&gt;0:
return dl
else:
print "Folder is Empty!"
sys.exit(1)

def print_dirlist(dl):
print "List of Files of Current Directory:"
for i in xrange(len(dl)):
print str(i+1)+")",dl</i><i>

def main():
parser = argparse.ArgumentParser(description=desc,epilog=epil)
actgroup = parser.add_argument_group("Actions")
actgroup.add_argument("-a","--add",metavar="\"Command\"",action="store",dest='add',help="Add new MACROS to MACROS' data bese, has include </i></files></file><file>")
actgroup.add_argument("-r","--remove",action="store_true",dest="remove",help="Remove the macros from macros' list")
actgroup.add_argument("-l","--list",action="store_true",dest="list",help="List all macroses")
parser.add_argument("-f","--format",metavar="%FORMAT%",action="store",dest="format",help="set format for search")
parser.add_argument("-b","--background",action="store_true",dest="bg",help="Run in BackGround like \"prog file &\"")
parser.add_argument("-v","--version",action="version",version="Version 1.1 by PomkaLK",help="Show Version and exit")
parser.add_argument("-o","--output",action="store",dest="output",help="Set output in macros \"<out>\"")
sortg = parser.add_argument_group("SORT")
sortg.add_argument("-t","--sort-time",action="store_true",dest="sortt",help="Sort files by Modefy Time")
sortg.add_argument("-s","--sort-size",action="store_true",dest="sorts",help="Sort by File Size")
sortg.add_argument("-R","--sort-reverse",action="store_true",dest="sortr",help="Reverse sort")

args=parser.parse_args()

if args.list:
list_macros()
sys.exit(0)
elif args.add:
add_macros(args.add)
sys.exit(0)
elif args.remove:
remove_macros()
sys.exit(0)

maclist=list_macros()
if (maclist == None) or (len(maclist)&lt;=0):
print "Macros list is empty!"
sys.exit(0)
else:
ans=getnum(maclist,"Enter the number of macros: ")
cmd=maclist<ans-1>.strip()
if cmd.count("</ans-1></out><out>")&gt;0:
if args.output:
cmd=cmd.replace("</out><out>","\""+args.output+"\"")
else:
while 1:
ans=raw_input("Enter the output: ")
if len(ans)&gt;0:break
cmd=cmd.replace("</out><out>","\""+ans+"\"")
if cmd.count("</out></file><file>")==1:
dirlist=get_dirlist(args)
print_dirlist(dirlist)
ans=getnum(dirlist,"Enter the number of File: ")
cmd=cmd.replace("</file><file>","\""+dirlist<ans-1>.strip()+"\"")
elif cmd.count("<files>")==1:
dirlist=get_dirlist(args)
print_dirlist(dirlist)
ans=1
files=""
while 1:
ans = getnum(dirlist,"Enter the number of file (anything-stop, 0-print files): ","Error: Need Number",0,True)
if ans==0: print_dirlist(dirlist)
elif ans&gt;0: files=files+" \""+dirlist</files></ans-1><ans-1>.strip()+"\""
elif ans&lt;0:
if len(files)==0:
print "You have Select one or more files!"
else:
break
cmd=cmd.replace("<files>",files)
if args.bg: cmd=cmd+" &"
os.system(cmd)

if __name__ == '__main__':
main()
</files></ans-1></file>



Справка!

usage: fselect <-h> <-a "Command"> <-r> <-l> <-f %FORMAT%> <-b> <-v> <-t> <-s> <-R>

Макрос должен включать который будет заменен на имя файла, - выбор нескольких файлов, outpput файл
Пример fselect -a "cat "
fselect --add="mplayer "

Опции:
-h, --help Показать помошь
-f %FORMAT%, --format %FORMAT% Установть формат маски файлов like "ls *.%FORMA%"
-o Text, --output Text

-b, --background Запустить в скрытом режиме like "prog file &"
-v, --version Показать версию программы

Действия:
-a "Command", --add "Command" Добавить макрос где "Command" - макрос

-r, --remove Удалить макрос из предложенного списка
-l, --list Показать список макросов

Сортировка:
-t, --sort-time Сортировать по времени
-s, --sort-size Сортировать по размеру
-R, --sort-reverse В обратном порядке




Пример использования:

1. Запускаем программу выводя список не всех файлов, а только avi
1
fselect -f avi




2. выбераем уже созданный мкрос


3. Выбераем файл из предложенного списка(файла с расширением avi так как мы это указали в первом шаге)

4. Получаем результат


Тэги: python
+ 5 -
Похожие Поделиться

as3k 17.07.2010 22:00 #
третий день работы с питоном и научились писать такие программы ?
да ну нафиг :>
xT 17.07.2010 22:05 #
почему нет? особенно если ранее писал на чем-то другом
pomkalk 17.07.2010 22:10 #
c++ delphi bash php
хотя бы знаний чего то из этого поможет!
silent 17.07.2010 22:00 #
По-моему, кнопку Tab придумали как раз для таких целей, а этот скрипт лишь увеличит путь до воспроизведения файла еще на несколько шагов.
Разве нет?
uscr 17.07.2010 22:08 #
Может была цель написать программу, а не написать нужную программу? Ну там потренироваться...
silent 17.07.2010 22:10 #
см.спойлер с предысторией
pomkalk 17.07.2010 22:29 #
И это тоже
pomkalk 17.07.2010 22:09 #
Разве нет....Там написано, кому то, пригодится....так как макрос можно любой написать, хоть на копирование файлов или еще что то где используется имя файла...
silent 17.07.2010 22:12 #
Очень плохо с русскама языканама? Включи проверку орфографии в браузере что-ли.
Причем тут макросы? Надо сделать что-то сложное - пишем скрипт, что-то простое, проигрывание это или еще чего простое - пользуемся клавишей Tab и никакого геммороя пошагового.
xT 17.07.2010 22:10 #
а можно юзать zsh
silent 17.07.2010 22:13 #
ну тут много чего можно придумать, главное что все на самом деле проще чем автор думает :)
pomkalk 17.07.2010 23:56 #
1. это именно для консоли
2. Если уж на то пошло то и не нужна....просто мышкой файл открыл с помошью нужной программы и все...
silent 18.07.2010 00:50 #
чувак, ты не понимаешь что именно в консоли можно ввести кусок названия файла, нажать кнопку Tab и он сам подставит (или предложит на выбор что подставлять) оставшуюся часть?
pomkalk 18.07.2010 07:35 #
Ты сам то понимаешь, я тебе не замену Таба предлогаю, он был и всегда будет, это просто программа....там руским написано, "Может кому пригодится"
У меня есть файли типа 0Ffsdw432.f4.mp3 043He4242.mp3
в которых совпадает первые 5-6 символов пару других, а помот еще совпадает.....как будет быстрее написать fselect и тыкать таб подставляя сначала одно, потом другое....расматрива где там большая буква стоит, а где маленькая...
Прога с одним файл добавляет, три строчки дописать будет много добавлять, и этот точно будет быстрее раскидывать скачаные файлы по папкам...
razum2um 18.07.2010 08:57 #
вообще не врубаю, за что топик минусуют, ибо есть такая же фигня: даже с табом...
а переименовывать их влом.
silent 18.07.2010 11:51 #
Как же ты невнятно говоришь, я нифига не могу понять, что ты имеешь в виду. Перечитывай свой коммент перед отправкой.
pomkalk 17.07.2010 22:29 #
Короче, Суть в чем, это я просто про mplayer так все рассказал....bash команда бывает в две строчки, и что бы это не писать постоянно...и не создавать alias в bashrc прото создаешь "Макрос" в который подставится имя файла
silent 17.07.2010 22:38 #
т.е. макрос написать проще чем алиас?
pomkalk 17.07.2010 22:48 #
Возни меньше
Shihad 17.07.2010 22:09 #
+1 за факт написания.
-1 за орфографию.

Такие ошибки, помню, делали в девятом "бэ". Где был один дебил со справкой, а остальные - дебилы без справок.
ner_uto 17.07.2010 22:10 #
На будущее - ставь кат. И пост длинновато выглядит, а уж в РСС, куда падают посты без спойлеров, он занимает ужас как много. Так что ставь кат, если будешь в следующий постах приводить код, даже если ставишь спойлер.
sakal 17.07.2010 22:24 #
В debian нет необходимости использовать easy_install для получения argparse, достаточно установить пакет python-argparse. В Python в stdlib есть модуль для парсинга параметров getopt.

P.S.
не сужу строго
pomkalk 17.07.2010 22:26 #
getopt и optparse считаеются устаревшими
в python 2.7 не будет optparse а будет argparse
digiwhite 17.07.2010 22:52 #
Думается что до python 2.7 лететь еще как до луны.
leonike 18.07.2010 00:36 #
он уже вышел две недели назад
leonike 18.07.2010 00:38 #
понял, что вы имели ввиду )
distruktor 18.07.2010 13:49 #
Я вот в толк никак не возьму. Народ чего вы так набросились? Человек ясно сказал "может кому и пригодится", вам не нужно бог с вами не пользуйтесь, минусовать то его зачем? На энтузиазме начинался Linux!!!
silent 18.07.2010 14:38 #
Линукс начинался как что-то полезное, а тут совсем бесполезная фигня.
distruktor 18.07.2010 14:45 #
Бесполезная мне и тебе, а кому-то может и пригодиться, не стоит все мерять одной мерой, Linux тем и хорош что есть выбор!
silent 18.07.2010 16:49 #
Может толкнуть новичков в неправильную сторону
exelens 18.07.2010 22:35 #
Тут человек учится и делиться.
Вот ты можешь показать примеры своих скриптов? Программ?
Не согласен с автором? Покажи что можешь лучше.

В общем =) Попробуй как Элвис.
silent 18.07.2010 23:54 #
http://code.google.com/p/0byte/source/browse/branches/silent?spec=svn258&r=258 мой бывший бренч в 0byte перед его удалением.

если будет чем поделиться - я поделюсь если посчитаю что это поможет людям и будет написано правильно.
exelens 30.08.2010 15:12 #
Другой момент. Я не програмист.
Код не читаю.
Напиши нормальным языком.
Накодит ... смотрть тут... работает так.

Иначе не понятно
silent 30.08.2010 16:01 #
в общем, одним прекрасным днем я решил сделать мир еще лучше и поучаствовать в каком-то оупенсорс-проекте, смотрю - велинукс-то оупенсорс, посмотрел код - страшненький, есть куда стремиться и написал nvbn, даже доступ получил.
кодил наверное с неделю, очень увлекся. начал делать кеширование, начал переводить все на mvc и в итоге получил от автора ответ что mvc тут вообще не нужен и лучше оставить этот код (код хуже вордпресса я вижу редко, но это - как раз тот случай), он работает и всем похуй.
в результате на продакшне оказалось только мое псевдокеширование css и js, а свой бренч я удалил.
exelens 30.08.2010 16:04 #
Я не могу тебе помочь.
У нас договорённость. Я не лезу в разработку, он не лезет в мои дела.
silent 30.08.2010 17:22 #
мне уже не надо помогать, я потратил неделю своего недешевого времени на это и обломался :)
exelens 31.08.2010 09:46 #
Это проблема коммуникаций.
Разбирайтесь сами.

А мне.. Да! ОЧЕНЬ!!!!! грустно, что возникла такая ситуация
leonike 18.07.2010 17:30 #
Вы знаете, может кому и пригодится, но я считаю, статьям, написанным с таким количеством ошибок и таким текстом, не место на ресурсе. Я многое готов простить, но только не "руским языком".
P.S. Надеюсь, не обидел автора.
exelens 18.07.2010 22:33 #
Вчера не мог исправить.
Сегодня те ошибки что в глаза бросились исправил.
Не нужно за русс яз ругаться.
Aesdana 18.07.2010 23:08 #
А я вот считаю, что место.
То что не дружит с языком - это, конечно, не гуд. Зато вон со скриптами дружит.
Поэтому опять предлагаю себя в качестве редактора/корректора.
Готова править мелочи вроде ката, а так же разгребать особо тяжёлые случаи.
K900 18.07.2010 23:10 #
Я тогда тоже =)
pomkalk 18.07.2010 23:49 #
Ошибок больше не будет!...я когда по русски быстро печатаю, промахиваюсь много((
K900 19.07.2010 00:03 #
Удачи тебе в тяжелом деле слепой десятипальцевой печати =)
kstep 19.07.2010 02:13 #
Блин. А мопед не мой, бля буду.
Ещё немного и это «может кому пригодится» станет локальным форсед мемом.
K900 18.07.2010 17:09 #
Я вот только одного не понимаю: почему бы не юзать автодополнение?
Craftuser 18.07.2010 18:17 #
Пиши что-нибудь действительно интересное, типа конвертера изображений, интегрируемого в контекстное меню Nautilus, жду. В остальном респект.
atommixz 21.07.2010 02:35 #
Автор, она само напрашивается, чтобы исключить шаг "2. выбераем уже созданный мкрос". Имхо оно по заданному расширению должно определять какой прогой запускать, а ещё лучше организовывать группы вроде:
"fselect -g video" - покажет все возможные видео файлы. Ты лучше организуй организуй к примеру hg реп на гуглокоде. Может закомитим чо нить, ага ;-)
atommixz 21.07.2010 02:47 #
Кстати, арчеводы, потому же принципу стал работать и yaourt. Пример:
$ yaourt urbanterror
1 aur/quake3-urbanterror 4.1-2 (21)
Urban Terror is a team-based tactical shooter based on the Quake 3 Engine (Quake3 Mod Version)
2 aur/urbanterror 4.1-7 (364)
Urban Terror is a team-based tactical shooter based on the Quake 3 Engine (Stand-Alone Version)
3 aur/urbanterror-client 4.1-2 (20)
Urban Terror is a team-based tactical shooter based on the Quake 3 Engine (client only)
4 aur/urbanterror-client-custom-hg 10-1 (0)
Urban Terror (client only, custom build with improved scripting)
5 aur/urbanterror-data 4.1-1 (20)
Urban Terror is a team-based tactical shooter based on the Quake 3 Engine (data only)
6 aur/urbanterror-server 4.1-3 (3)
Urban Terror is a team-based tactical shooter based on the Quake 3 Engine (server only)
7 aur/urbanterror-server-custom-hg 10-1 (0)
Urban Terror (server only, custom build with improved scripting)
==> Enter n° (separated by blanks, or a range) of packages to be installed
==> ----------------------------------------------------------------------
==>