?

Log in

No account? Create an account

Previous Entry | Next Entry

видео со змеей

(noob rant) А вот Питон. Никогда раньше на нем не писал, но тут приходят клиенты и говорят: хотим ваше чудо чудесное в своем приложении на питоне использовать, да на винде, не где-нибудь. Я им говорю, ща, демку вам набросаем. Про себя думаю, это ж Питон, там батарейки, аккумуляторы, богатая экосистема, напишешь import antigravity и полетел. А там... Вот есть технология, которая примерно ровесница самому питону, и до сих пор вполне себе работает во всех виндах - Video for Windows. Какие есть в питоне средства с ней работать? Я так понял, вообще никаких. Ну ладно, может это слишком виндово для гзмеев. Для сжатия видео все равно будет моя DLL-ка вызываться. Но потом мне надо сжатое видео в файл записать. Что там у вас в библиотеках для записи AVI, сравнительно простого и старинного формата? Да как-то тоже практически ничего, про видео видно лишь пару оберток над ffmpeg. Вызывать стороннее приложение - вот все, на что питонисты способны тут. В итоге плюнул, сделал свою простенькую писалку AVI в 128 строк, для небольших файлов.
В итоге все заработало как хотелось, даже в процессе получилось в моей DLL-ке баг найти: в одном месте 64-битный указатель обрезался до 32 бит при передаче в мою виртуальную машинку, ИЧСХ при загрузке DLL-ки из моих тестовых прог и при загрузке кодека в приложения вроде VirtualDub все раньше работало, т.е. указатель тот всегда оказывался нулем в верхних битах. А вот при вызове из питона не оказался, так получилось это обнаружить.
Для работы с DLL использовал модуль ctypes. Они там берутся контролировать типы передаваемых данных, и, как я понял, для передачи бинарных данных вроде BYTE* предполагается использовать массивы вроде c_ubyte * size, причем тип указывается при объявлении прототипа ф-ии, и если у меня при разных вызовах передается разное количество данных, то получается фигня: массив другой длины это уже другой тип, его ctypes не дает передать. Это что же, перед каждым вызовом надо заново определять тип вызываемой функции? Или, видимо, надо объявлять там POINTER(c_ubyte), а при вызовах делать cast()...
И в то же время этот их строгий контроль типов спокойно разрешил целое число вместо указателя на void передать (ненамеренно). С непривычки тяжело, конечно, пока писал скрипт на 200 строк успел несколько раз словить в рантайме "а вот тут число аргументов не то", "а вот эту переменную я не знаю" и другие прелести недотипизированных интерпретируемых языков.

Tags:

Comments

( 13 comments — Leave a comment )
alll
Dec. 14th, 2017 04:10 am (UTC)
> этот их строгий контроль типов спокойно разрешил целое число вместо указателя на void передать (ненамеренно)

Это же фирменная C(++) мулька, видимо то ли у авторов либы даже мысли не возникло "а что, так можно было?", то ли мысль возникла, но пожалели целевую аудиторию, которая изрядной частью сишные разработчики.
theiced
Dec. 14th, 2017 04:14 am (UTC)
ты, главное, этот код петонастам не показывай - они ж взлетят на пердячной тяге после первых строк 10 :)
alexispokrovski
Dec. 14th, 2017 07:21 am (UTC)
Питон без тестов -- гм... разве что совсем маленькое что-то.
olegy
Dec. 14th, 2017 08:39 am (UTC)
Я питон успешно использую толко для каких то своих автоматизаций - генерация хидеров, вычисление размеров стека по list файлам, генерация автомата и т.п.
bvlb
Dec. 14th, 2017 11:48 am (UTC)
Насколько я понимаю, ctypes он все-таки не для контроля типов, а чтобы привинчивать внешние либы и какого-то чекинга от него ожидать не след.
Для статической типизации - Type Hints, которые только в последних версиях появились, а с нормальным синтаксисом для переменных в 3.6 и окончательно устаканиться должны в след. версии через пол-годика.
Я их понемногу щупаю сейчас, пока ощущения приятные.
thedeemon
Dec. 14th, 2017 02:18 pm (UTC)
Да, ctypes для общения с нативным кодом, и по факту проверку типов при вызове того кода они там сделали, что в целом хорошо. Просто надо приноровиться.
Про type hints я правильно помню, что их сам интерпретатор не проверяет, а надо отдельный линтер (майпай? май тай? :) запускать?
bvlb
Dec. 14th, 2017 02:27 pm (UTC)
да! у меня тайпчекер встроенный в IDE, на которой я много лет сижу, так что я не заморачивался. А если бы был в голом виме, то пришлось бы морочиться с прикручиванием майпая. Подозреваю, что рано или поздно оно окажется в интепретаторе, но пока не планируют.
thedeemon
Dec. 14th, 2017 03:41 pm (UTC)
А что за IDE? PyCharm?
bvlb
Dec. 14th, 2017 04:56 pm (UTC)
yep. с IdeaVim.
theiced
Dec. 14th, 2017 07:14 pm (UTC)
питон и так отвратителен чуть более чем полностью - зачем к нему ещё сверху типизацию прикручивать?
bvlb
Dec. 14th, 2017 07:20 pm (UTC)
"Тот, кто осознал в себе природу Будды, видит ту же природу Будды в каждом человеке."
anonim_legion
Dec. 28th, 2017 07:16 pm (UTC)
Это пластическая хирургия, чтобы он был менее страшен.
grey_demonstr
Dec. 17th, 2017 03:26 pm (UTC)
Чтобы пореже ловить в рантайме всякую ерунду, рекомендую поставить что-нибудь IDE-подобное, ну хотя бы Sublime (благо к нему всякие линтеры для всего подряд в одну команду прикручиваются).
( 13 comments — Leave a comment )