Как стать автором
Обновить

Комментарии 26

Спасибо, полезная статья!

В своих проектах после долгих размышлений я все-таки отказался от чистого Python API и использовал Boost.Python. Плюс там есть поддержка NumPy, что важно. Пока все работает стабильно.

Как альтернативу можно рассмотреть pybind11. Почти то же самое, только Boost тащить не нужно.

Здесь думаю важен порядок подключения линкера -Wl. Кто знает точнее напишите про это в коментах, дополню ответ.

Всё довольно просто — символы ищутся в один проход и все неиспользуемые выбрасываются. Если поставить simple.c в конец, то получается, что использование символа Py_Initialize() линкер увидит после того, как посмотрит в библиотеки питона, все символы которых будут к этому моменту выброшены (потому что не использовались).


В общем, порядок передачи аргументов важен. Есть способ решить эту проблему через флаги -Wl,--start-group и -Wl,--eng-group, но в данном случае это излишне.

Спасибо.
НЛО прилетело и опубликовало эту надпись здесь
В особо запущенных это не поможет, т.к. особо запущенные — это циклические ссылки.
Для борьбы с этом достаточно в самом начале указать -Wl,--start-group
А end-group можно не указывать.
НЛО прилетело и опубликовало эту надпись здесь
Проблема с которой я столкнулся и не смог пока понять


pVal = PyDict_GetItemString(pDict, (const char *) val);
...
Py_XDECREF(pVal);


PyObject* PyDict_GetItemString(PyObject *p, const char *key)
Return value: Borrowed reference.

When a function passes ownership of a reference on to its caller, the caller is said to receive a new reference. When no ownership is transferred, the caller is said to borrow the reference. Nothing needs to be done for a borrowed reference.
Спасибо.
Это очень странно — почему не из питона вызывать написанное на С а наоборот?
Так обратно тоже надо, когда скриптовый язык используется для расширения, чтобы из основной программы добраться до внутренностей скрипта.

Но всё-таки это взаимодействие туда/сюда в той же в Lua, через стэк, сделано гораздо проще и красивее.
Так обратно тоже надо,

слона обучить кататься на роликах тоже надо. Питон это высокоуровневый язык удалённый от железа, С — низкоуровневый, близкий к железу. Кто кого должен вызывать? Принцип иерархии забыли?
Может не самый удачный пример, но вот какой-нибудь CAD (freecad?), где пользователю дан питон для автоматизации своих действий и написания плагинов.
Всё-таки наверное можно позволить пользователю набрать в консоли a=1; b=a+2; а потом из низкоуровнего C забрать значение 'b' у высокоуровневого питона и что-то с ним дальше делать?
Или исходя из вашего принципа иерархии для этого его надо сначала целиком на высокоуровневом питоне переписать, а в качестве скриптового языка расширения наоборот прикрутить tcc какой-нибудь, раз он уровнем пониже?
а потом из низкоуровнего C забрать значение 'b' у высокоуровневого питона и что-то с ним дальше делать?

пишем на С что мы со значением дальше делаем и используем это как функцию в более высокоуровневом ( в Питоне считываем с консоли и вызываем функцию С). Тот же принцип софтваредизайна например что низкоуровневая функция не должна вызывать высокоуровневую иначе будет спагетти — код. Тот же принцип что надо избегать GOTO выходы из цикла. Если рассматривать задачу слишком локально (как в твоём примере), то может показаться что удобно сделать так, но это приведёт потом к каше.
А тут ещё плюсы таким постам ставят
GOTO надо пользоваться разумно, а не прыгать им через пол файла.

GOTO, break, continue — это jump asm.
Как это будет выглядеть на примере того же freeCADa?
надо переписать его на высокоуровнем питоне, ну чтобы иерархия не нарушалась?
Вот уж где каша будет.
Хватает случаев когда скриптовый язык нужен лишь в качестве, грубо говоря, достаточно гибкого .ini файла, каким бы высокоуровневым он не был.
Мы вот например тестировщикам выставляем питоновский АПИ как упрощенную альтернативу сишному. Причем приходится работать сразу в обе стороны — и из питоновского сишный код вызывать, так и из сишного в питоновский коллбеки пробрасывать. Причем местами совсем необязательно получается, что один язык более высокоуровневый чем другой. Скорее один модуль на С++, а другой на питоне и друг друга должны уметь вызывать.
Заминусовали нормального человека. В этом весь хабр.
Давай ему поднимем немного.
Так я тоже делал(позже может напишу про это).
Мне было нужно для следующего. Был готовый проект(давно написанный) по обработке данных (парсинг текста и складирование в БД), а поддерживать его надо и появлялись новые форматы данных(которые нужно обрабатывать). И в конце, концов работать со строками в Си надоело, проще их отдать python и получить обработанные данные назад.
может тогда через REST, не прикручивая чёрт знает что в одной программе. А вообще задобал тут неграмотный народ.
Я давно все на python переписал )), тогда мне нужно было python хоть как-то пропихнуть для использования. У нас имелись некоторые ограничения на используемые языки.
а, нуда, у тебя
парсинг текста и складирование в БД
что есть высокоуровневая задача и С там вообще никаким боком не нужен. А можно подетальнее что и как там делалось? в наше цивилизованное время пора задуматься о распаралеливании париснга и прочих операций с текстом.
У нас используется postgresql, но для него написана своя библиотека которая делает работу с ним объектно ориентированной. На тот момент такой библиотеки для python еще не было(сейчас уже написали). Данные приходят в виде псевдотаблиц(столбцы, заголовки, разделители записей — разгораживаются символами |=-_+ и т.п.). Нужно вытаскивать значения из ячеек и писать в БД их.

+-----------+-----------+
|Cell1___|Cell2____|
+-----------+-----------+
|Val1____|Val2____|
+-----------+-----------+

Примерно так.

Есть планировщик который такие таблицы раскидывает по воркерам. Но что бы одну таблицу распарсить нескольких воркерами это будет еще тот геморой )
. Данные приходят в виде псевдотаблиц
откуда приходят, почему в таком виде? Вроде бы в общепринятых форматах типа JSON или YAML прямое отображение в ОО представление и в БД, зачем какой то левый формат юзать
Откуда приходят не скажу.
Вся эта система не мной придумана и не мной отменена будет. Так исторически сложилось годов с 80-х(про json не слышали к сожалению в те года), если не раньше. Каждая таблица имеет несколько страниц, страница размером 80 символов в ширину и 22 строки в высоту. Что бы целиком на старых экранах отображаться в dos или что там тогда было.
К тому же в те года каналы связи были очень чувствительны к размеру передаваемых данных => придумали гениальное решение все буквы кириллицы которые имеют сходные буквы в латинице заменять на эквиваленты. А (2 байта) ~ A (1 байт), К (2 байта) ~ K (1 байт)

Я то как раз это в json перегоняю.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории