satfan
Вы писали: язык в интерпретаторе Bash - сможете малаленький Bash скрипт переделать в Python 3 &
Вообще, это возможно сделать. Но даже то, что питон является кроссплатформенным языком (программы на нём можно запускать и в одной операционной системе, и в другой операционной системе, и в третьей), не делает программы на питоне кроссплатформенными. Ну, например, в программе на питоне для Linux питон может обратиться к программе, установленной в Linux, и использовать определённые пути к ней, к себе, к файлам каким-то, которые заложены в Linux ввиду её устройства. Но если эту же программу, написанную для Linux, поставить в Windows, то во-первых, в Windows нет этой программы, которая в Linux установлена, её надо установить сначала, а во-вторых, даже если её и поставить, то в Windows она ставится по другим путям и работает там вообще по-другому, и файлы тоже все вспомогательные в других местах расположены. То есть это придётся делать полиморфный питонокод, который ведёт себя типа одинаково, но под Linux делает свою основную работу линуксовым образом, а под Windows делает то же самое виндовым образом. А эти действия могут вообще в корне отличаться, хотя результаты этой работы выглядят похожими друг на друга. Это называется ad-hoc полиморфизм. При таком виде полиморфизма нужно каждую версию кода, делающего одно и то же, писать уникальным образом. Вот из-за этого, рациональнее всегда делать две версии программы - одна для Linux, а другая - для Windows. То есть ты их пишешь, называются они одинаково у тебя, версии у них тоже одинаковые стоят, но внутри они вообще полностью разные. Какие-то кусочки алгоритмов у них могут быть одинаково реализованы, но б
ольшая часть этих программ, процентов девяносто или восемьдесят, наверное, написана абсолютно по-разному, чтобы быть максимально оптимальными для тех операционных систем, для которых они написаны.
satfan
сможете малаленький Bash скрипт переделать в Python 3
Его нельзя переделать, его надо заново писать. Даже если бы он у меня на питоне был написан, под винду его надо было бы писать заново и для винды ещё дописывать куски, которых нет в линуксовой версии. Потому что винда - это винда, там куча тупизны в самой системе, поэтому там надо для урегулирования вопросов с этой тупизной писать допольнительный код. Просто вспомни, как надо было писать сайты раньше: сначала ты пишешь сайт, а потом пишешь целую тонну кода разного в этом сайте, чтобы этот сайт нормально открывался в виндовом Internet Explorer'е, потому что эта виндовая параша была ни к селу ни к городу, но при этом успела захватить рынок браузеров и из-за этого стояла практически на каждом компе у каких-нибудь бабок тупых, которые других браузеров не знали.
Почему я пишу на Shell'е? Хотя можно было бы писать на питоне и потом быстро переписывать эти питоновские скрипты под винду. (Или заранее их писать так, чтобы выделять из них некроссплатформенные участки кода в отдельные функции, которые потом переписываются под каждую операционную систему.) Потому что у меня скрипты активно используют средства операционной системы. Вот в
том участке, который я приводил, активно используется программа sed, которая установлена практически везде в Linux (этой программе около сорока лет; даже больше, наверное), но я пользуюсь не только sed'ом, часто и программу awk использую, и многие другие линуксовые проги, которыми пользуется весь мир десятилетиями и которые практически во всех линуксах установлены сходу прямо после установки самой операционной системы.
Вот кусок этого же скрипта, который в скрипте отвечает за выбор разрешения видео с Ok.ru
# Determine the optimal format for video on Ok.ru;
# It returns the hd format or the sd format if the hd format
# doesn't exist
# load_file_ok_get_vformat(url)
# args:
# url - The url for video on Ok.ru
# return:
# "format for hd" - String with format for hd
# "format for sd" - String with format for sd if no hd
# none - If no sd and no hd
load_file_ok_get_vformat()
{
local url=$1
Ytl "$url" | awk '
state == 0 {
if ($1 ~ /^(sd|hd)$/)
state = 1
}
state == 1 {
if ($1 ~ /^hls-[0-9]+$/) {
vformat = $1
state = 0
}
}
END {print vformat}
'
}
Как видишь, тут уже не sed используется, а тут awk используется. Там, короче, выдаётся несколько колонок и в них надо полазить туда-сюда и таким образом выбрать подходящий формат для скачиваемого видео.
А это вот для Rutube.ru код, недавно его писал, тут вообще m3u8 листы выбираются, а не прямые видео
# Determine the optimal format for video on Rutube.ru;
# It returns m3u8-form for different formats; for the 720p format
# otherwise for the 1080p format otherwise for the 480p format if
# previous formats don't exist
# load_file_rt_get_vformat(url)
# args:
# url - The url for video on Rutube.ru
# return:
# "m3u8-NNNN" for 720p |
# "m3u8-NNNN" for 1080p |
# "m3u8-NNNN" for 480p |
# none
load_file_rt_get_vformat()
{
local url=$1
Ytl "$url" | awk '
$1 ~ /^m3u8/ && $2 == "mp4" {
if ($3 ~ /x480$/) {
has480 = 1
vformat480 = $1
}
else if ($3 ~ /x720$/) {
has720 = 1
vformat720 = $1
}
else if ($3 ~ /x1080$/) {
has1080 = 1
vformat1080 = $1
}
}
END {
if (has720) {
vformat = vformat720
}
else if (has1080) {
vformat = vformat1080
}
else if (has480) {
vformat = vformat480
}
print vformat
}
'
}
То есть вот эти вещи удобно делать через awk, а не через sed. Но при этом в страницах какие-то куски искать и вычленять из этих кусков внутренние куски лучше sed'ом, чем awk.
Поэтому мне нужны обе эти программы на компе одновременно. Представляешь, сколько мне придётся ставить в винду этих программ, которых там нет изначально ни одной?
Вот поэтому я пишу эти скрипты на Shell'е и пользуюсь ими в Linux'е. Винда она не для этого.
Кстати, на питоне я тоже пишу себе скрипты для системы, но что я пишу? Я пишу, например, распаковщик внутренних файлов браузера. У питона есть хорошие модули для распаковки разных архивов и вот я с этим столкнулся однажды, что они мне понадобились. Я писал скрипт для анализа внутренностей браузера, чтобы вытаскивать все открытые в данный момент ссылки в браузере и сохранять их в текстовый файл. Это типа когда надо отойти от компа срочно, а у тебя в браузере куча ссылок открыта и их надо все прочитать, просмотреть, а закрывать браузер не хочется, чтобы их потом по новой не искать все. Вот я себе такую программу написал. Так вот, когда я стал залазить под капот браузеру (без этого сам по себе он не даёт ссылки сохранять, типа закрывай браузер и всё, а потом ищи эти ссылки по новой, а их там двадцать штук, а может и больше), то под капотом оказалось, что эти ссылки хранятся в запакованном виде. Причём запакованы они были не каким-то архиватором обычным, а каким-то видоизменённым архиватором. То есть в линуксе, в котором стоит куча архиваторов, я этот файл со ссылками распаковать даже ничем не смог. Потом я стал его анализировать, что у него там внутри, и открыл для себя, что это обычная архивация, но с дописыванием каких-то метаданных в этот архив. То есть в лине разбирать эту структуру запакованного файла было не так удобно, и я взялся за питон. На питоне я написал отдельный скрипт, которому подаётся такой файл, запакованный обычным способом, но с дописанной какой-то хренью, питоновский скрипт всю эту хрень состригает, потом он этот файл распаковывает и выдаёт наружу. И вот у меня получилось в итоге два скрипта: один скрипт на Shell'е, который и делает всю работу основную; другой скрипт на питоне, который в какой-то конкретный момент времени просто запускается Shell-скриптом и распаковывает файл из искривлённого архива, а потом с этим файлом идёт дальнейшая работа в том же Shell-скрипте. Получилась такая комбинированная программа из скриптов на разных языках. Вот там мне понадобился питон, потому что в лине это было сложно распаковать. Но зато в лине проще общаться с самой операционной системой через Shell, потому что в Shell'е все средства для работы с директориями более удобные, чем в питоне.
Что я в итоге написал. Просто когда надо сохранить ссылки из браузера, я нажимаю комбинацию клавиш Ctrl + Win + f и у меня в директории на виду появляется файл для Emacs Org-mode, в котором есть все ссылки, открытые в данный момент в браузере. И дальше я закрываю браузер и выключаю комп. А потом я прихожу, включаю комп и из этого org-файла запускаю ссылки все.
Вот так он выглядит в итоге
картинкаТакже я сделал там выгрузку в HTML-страницу (не везде же поставлен Emacs) и при запуске с параметром html, он сохраняет html-файл с этими ссылками внутри.
Вот так он выглядит в итоге
картинкаЕщё текстовый вид есть, из него в любой формат можно переводить, если не org и не html нужен, а какой-то вообще другой.
[guest@localhost ~]$ ffurls --help
usage: ffurls [ --text | --org | --html ]
Save open browser Firefox tabs (title and url) to the file with a given format.
noarg -- The default format from config file is used.
--text -- Save output to text format.
--org -- Save output to org format.
--html -- Save output to html format.
--version -- Print program version information.
[guest@localhost ~]$ ffurls --html
Try `ffurls --help' for more information.
[guest@localhost ~]$
То есть программа написана на Shell'е, но она иногда, в какие тонкие моменты, пользуется скриптами на Python'е.
Это вот я тебе привёл пример, что далеко не всегда программа пишется только на том или только на этом. У меня есть программы, которые написаны вообще на нескольких языках одновременно, и на двух, и на трёх. Так что таких ограничений типа “пишешь на питоне - пиши только на питоне” там нет. Что нужно для программы, на том ты и пишешь, и оно может варьироваться постоянно. Всё зависит от возникающих в процессе разработки задач.