metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-05-22 02:11 pm

Как страшно жить или Рукожопые Питонасты

Вырывать руки за такую обработку ошибок. С корнями из жопы вырывать:

Welcome to GNU Radio Companion 3.6.0
Error: 'options'

>>> Failure
Traceback (most recent call last):
File "d:\programm\gnuradio\lib\site-packages\gnuradio\grc\gui\MainWindow.py", line 171, in new_page
flow_graph = self._platform.get_new_flow_graph()
File "d:\programm\gnuradio\lib\site-packages\gnuradio\grc\base\Platform.py", line 148, in get_new_flow_graph
def get_new_flow_graph(self): return self.FlowGraph(platform=self)
File "d:\programm\gnuradio\lib\site-packages\gnuradio\grc\python\FlowGraph.py", line 31, in __init__
_FlowGraph.__init__(self, **kwargs)
File "d:\programm\gnuradio\lib\site-packages\gnuradio\grc\base\FlowGraph.py", line 35, in __init__
self.import_data()
File "d:\programm\gnuradio\lib\site-packages\gnuradio\grc\base\FlowGraph.py", line 176, in import_data
self._options_block = self.get_parent().get_new_block(self, 'options')
File "d:\programm\gnuradio\lib\site-packages\gnuradio\grc\base\Platform.py", line 158, in get_new_block
def get_new_block(self, flow_graph, key): return self.Block(flow_graph, n=self._blocks_n[key])

File "d:\programm\gnuradio\lib\site-packages\gnuradio\grc\base\odict.py", line 34, in __getitem__
return self._data[key]
KeyError: 'options'
Error: 'options'
Вы думаете, как ошибка с таким высокодуховным и легкочитаемым сообщением лечится? А вот так:
set GRC_BLOCKS_PATH=D:\programm\gnuradio\share\gnuradio\grc\blocks

Метапрограммирование во все поля. Ключ 'options' - это ссылка на файл лежащий по вышеуказанному пути, с расширением xml, но вместо того, чтобы показать ошибку "файл не найден" "ошибка пути" или "проверьте переменные окружения", оно валится с KeyError.

Нашел сравнением окружения процесса python.exe на машине где "все работает" и где "не работает".
Причем там где не работает - из программы даже выйти нельзя. Потому что падает оно в конструкторе формы и она остается недоделанной. По моему, это рукожопие чудовищное.

[identity profile] vp.livejournal.com 2012-05-22 11:41 am (UTC)(link)
Питон с гуем еще? Ну вообще класс.

[identity profile] metaclass.livejournal.com 2012-05-22 11:46 am (UTC)(link)
pyGTK страшен.
pyqt не знаю.
wxWidgets тоже рукожопие, по сведениям от пауков.

[identity profile] jdevelop.livejournal.com 2012-05-22 12:59 pm (UTC)(link)
вот не нада, оно няшное и кавайное

[identity profile] berezovsky.livejournal.com 2012-05-22 11:45 am (UTC)(link)
а что такое гнурадио? радио радонеж можно слушать?

[identity profile] metaclass.livejournal.com 2012-05-22 11:45 am (UTC)(link)
Прием голосов пауков из розетки.

[identity profile] trueblacker.livejournal.com 2012-05-22 11:55 am (UTC)(link)
"проверьте окружение" же!

[identity profile] besm6.livejournal.com 2012-05-22 12:59 pm (UTC)(link)
Эээ... Если KeyError - то это ключа такого нет. Тогда он не может быть ссылкой на файл. Он, может быть, _должен_ быть ссылкой на файл...

[identity profile] metaclass.livejournal.com 2012-05-22 01:27 pm (UTC)(link)
А, они там при старте файлы грузят, а потом по имени их ищут. Поэтому и не находит, т.к. ничего не загружено.

[identity profile] besm6.livejournal.com 2012-05-22 02:15 pm (UTC)(link)
Ну да, естественно. Тот, кто грузит, писал так, чтобы грузить все то, что есть. Чтоб не менять код ни при добавлении файлов, ни при пропадании нужды в них.

А тот, кто писал форму, полагал, что для нормальной работы этот файл все равно нужен, поэтому при нормальной работе он все равно будет, а обрабатывать ненормальную ситуацию так лень, и что с нею делать, он тоже не придумал...

У меня недавно такой этап в хаскеле был. Когда, конечно, видно, что функция частичная, но вроде бы тут не должно быть пустого списка, а оборачивать в Maybe, а главное, потом разворачивать обратно или join'ить, так лень, и композиция сразу перестает работать... Кинуть исключение, конечно, можно, беда в том, что поймать _своевременно_ нельзя - дело происходит в чистом коде. Логгинг, опять же, неудобно делать, поэтому он не делается.

А потом вдруг оказывается, что контракт не выполняется, программа падает с заявлением Prelude.undefined, и ищи этот undefined... Ну ладно, слов undefined в ней немного, а вот !! хватает...

А с питоном тоже аналогично получается, когда к программке (суффикс "к" важен), которая изначально была сделана как запускаемая вручную, в процессе развития приделывается демонизация - а потом сиди и думай, то ли почта не ходит, то ли offlineimap рухнул. Потому как ручная программка может себе позволить неперехваченное исключение, его видно... Причем рухает он, ну, раз в два месяца, типа когда вдруг сетка в особо неудачный момент отвалилась.

[identity profile] metaclass.livejournal.com 2012-05-22 02:22 pm (UTC)(link)
Там печально вообще. Пути для поиска конфигов, в которых прописана настройка путей к эти файлам, захардкодены в C:\Program Files\ вместо указания относительного пути.

[identity profile] besm6.livejournal.com 2012-05-22 02:39 pm (UTC)(link)
Ну, может, для них абсолютный путь - это то, что начинается с http://

[identity profile] stdray.livejournal.com 2012-05-22 03:49 pm (UTC)(link)
>Нашел сравнением окружения процесса python.exe на машине где "все работает" и где "не работает".

А можно поподробней?

[identity profile] metaclass.livejournal.com 2012-05-22 04:26 pm (UTC)(link)
Берем фар с плагином "список процессов" или procexp от sysinternals. Открываем процесс и смотрим его окружение на одной машине (где ставилось из инсталлятора, поставившего 100500 хуй пойми чего, но при этом все равно неработоспособного без ручной еботни) и на второй, куда было все установленное скопировано, запустилось, но работает с ошибкой.
Основная разница оказалась именно в этой переменной окружения, а все остальные вариации, внезапно хардкодед так, что нигде кроме program files работать не будут.

[identity profile] stdray.livejournal.com 2012-05-22 08:02 pm (UTC)(link)
Спасибо, большое. Я как-то совсем по-дурацки в таких ситуациях: либо гуглю пока не найду в точности подобную проблему, либо переставляю все до победного.

[identity profile] metaclass.livejournal.com 2012-05-23 06:06 pm (UTC)(link)
Я надрочился отлаживать что попало с помощью procmon/procexp/windbg
С минимально вменяемыми программистами, т.е. если баги только в окружении (90% багов вида "не работает") - спасает более чем полностью.

[identity profile] juan-gandhi.livejournal.com 2012-05-22 04:12 pm (UTC)(link)
Менталитета у программистов такая. Вместо приличного тотального программирования - претензии к окружающему миру, мол, "у вас должны быть установлены переменные". Что им кто-то должен - это, наверное, им мамы сказали.

[identity profile] metaclass.livejournal.com 2012-05-22 04:28 pm (UTC)(link)
Не, скажем, я допускаю, что можно использовать некие готовые инструменты в виде исполняемых файлов или библиотек, но исключительно в стиле: "полностью описано в документации, можно скачать готовый архив со всем, можно указать относительный путь".
В крайнем случае - я модифицирую перед запуском окружение, чтобы не изменять глобальное (мало ли что еще сломается).