Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
1

Модули для Python на Си

07.02.2017, 15:18. Просмотров 903. Ответов 14

Подскажите литературу по написанию модулей для Python на С/С++ ( Си API)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2017, 15:18
Ответы с готовыми решениями:

Подгрузить все модули Python
Вопрос - как подгрузить все достпные модули питона?

Можно ли модули, написанные на Python, использовать в программе, которая пишется на Delphi? И если можно, то как?
Можно ли модули написанные на Python, использовать в программе которая пишется...

Какие модули использовать для работы с рабочим столом
Всем привет решил написать для себя програмку для роботы с рабочим столом но...

Нужен компилятор Си для в Windows 7 64x для корректной установки библиотек и модулей Python
Приветствую форумчан. Возникла проблема при попытке установки grab, очень...

Python - момент истины. Python - как оружие возмездие против системы
Какие модули в python мне нужны для взлома баз данных? Перехвата информации?...

14
dondublon
2146 / 1064 / 213
Регистрация: 17.03.2012
Сообщений: 6,417
Записей в блоге: 5
08.02.2017, 13:24 2
Стесняюсь спросить, а официальной доки недостаточно?
0
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
08.02.2017, 13:31  [ТС] 3
Имею ввиду именно литературу, книги на русском...
0
dondublon
2146 / 1064 / 213
Регистрация: 17.03.2012
Сообщений: 6,417
Записей в блоге: 5
08.02.2017, 13:53 4
Вот что мне гугль выдал сходу
https://habrahabr.ru/post/44520/
https://lancelote.gitbooks.io/interm...extension.html

ПММ, тема не такая объёмная, чтобы написать целую книгу.
1
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
08.02.2017, 18:40  [ТС] 5
Да я читал некоторые статьи, но они не прояснили дело.
Авторы пишут как правило размыто, не объясняя детали того как это правильно делать, вместо этого приводят какие-то упрощенные примеры, вместо того что бы объяснять общие принципы/схему.

Добавлено через 3 часа 32 минуты
К примеру я взял пример из https://lancelote.gitbooks.io/interm...extension.html

Модифицировал его под python3
Кликните здесь для просмотра всего текста
C++
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
#include <Python.h>
 
 
// Эту функцию мы вызываем из Python кода
static PyObject* addList_add(PyObject* self, PyObject* args)
{
 
  PyObject * listObj;
 
  // Входящие аргументы находятся в кортеже
  // В нашем случае есть только один аргумент - список, на который мы будем
  // ссылаться как listObj
  if (! PyArg_ParseTuple( args, "O", &listObj))
    return NULL;
 
  // Длина списка
  long length = PyList_Size(listObj);
 
  // Проходимся по всем элементам
  int i, sum =0;
  for(i = 0; i < length; i++){
    // Получаем элемент из списка - он также Python-объект
    PyObject* temp = PyList_GetItem(listObj, i);
    // Мы знаем, что элемент это целое число - приводим его к типу C long
    long elem = PyLong_AsLong(temp);
    sum += elem;
  }
 
  // Возвращаемое в Python-код значение также Python-объект
  // Приводим C long к Python integer
  return Py_BuildValue("i", sum);
}
 
// Немного документации для `add`
static char addList_docs[] =
    "add( ): add all elements of the list\n";
 
/*
Эта таблица содержит необходимую информацию о функциях модуля
<имя функции в модуле Python>, <фактическая функция>,
<ожидаемые типы аргументов функции>, <документация функции>
*/
static PyMethodDef addList_funcs[] = {
    {"add", (PyCFunction)addList_add, METH_VARARGS, addList_docs},
    {NULL, NULL, 0, NULL}
};
 
/*
addList имя модуля и это блок его инициализации.
<желаемое имя модуля>, <таблица информации>, <документация модуля>
*/
 
static struct PyModuleDef cModPyDem =
{
    PyModuleDef_HEAD_INIT,
    "addList", /* name of module */
    "Add all ze lists",          /* module documentation, may be NULL */
    -1,          /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
    addList_funcs
};
 
PyMODINIT_FUNC initaddList(void)
{
   return PyModule_Create(&cModPyDem);
}


Скомпилил в MSVC2010 получил addList.dll в той же папке создал скрипт для проверки

Python
1
2
3
4
import addList
 
l = [1, 2, 3, 4, 5]
print("Сумма элементов списка - " + str(l) + " = " + str(addList.add(l)))
Запуска: не видит модуль пишет:

import addList
ImportError: No module named 'addList'
0
shsv
403 / 270 / 189
Регистрация: 20.05.2016
Сообщений: 574
08.02.2017, 20:46 6
Переименовать в addList.pyd?
0
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
08.02.2017, 21:42  [ТС] 7
Цитата Сообщение от shsv Посмотреть сообщение
Переименовать в addList.pyd?
Да так работает.
(блин ну и выдумают же.)
0
Garry Galler
1438 / 1159 / 427
Регистрация: 28.10.2013
Сообщений: 2,939
08.02.2017, 22:05 8
Avazart,
Побочный вопрос: с cython'ом не пробовали экспериментировать?
Не как с языком (хотя, если изучить - то можно и модули на нем писать - почти как на python, но в конечном итоге - тот же Си на выходе), а как с модулем для прямой трансляции python кода в pyd. Определенное подмножество скриптов (отнюдь не хэлловордов) на python он вполне себе транслирует в Си, а затем в рабочий pyd.
Но, увы, на некоторых выдает ошибки синтаксиса - хотя, вроде как является надмножеством над python. В любом случае - тоже неплохая тема для попробовать и поэкспериментировать:-)
0
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
08.02.2017, 22:09  [ТС] 9
Цитата Сообщение от Garry Galler Посмотреть сообщение
Побочный вопрос: с cython'ом не пробовали экспериментировать?
Не охота пока лезть, не особо интересует автоматическая генерация, дополнительные затраты на изучение лучше сразу на С. Есть планы еще посмотреть обвертку C++ boost/python

shsv, А есть ли способ загрузить с dll расширением, ведь как то грузятся длл-ки от Qt ?
0
shsv
403 / 270 / 189
Регистрация: 20.05.2016
Сообщений: 574
09.02.2017, 12:55 10
Пишут, что наряду с module.pyd импортируется и module.dll, если первый не найден. Однако, у меня ни разу не получилось (не считая жутковатого способа с importlib.machinery и ExtensionFileLoader). Так что я бы и сам хотел знать...
0
shsv
403 / 270 / 189
Регистрация: 20.05.2016
Сообщений: 574
11.02.2017, 23:31 11
Вобщем из
importlib.machinery.all_suffixes()
Returns a combined list of strings representing all file suffixes for modules recognized by the standard import machinery.
и
Python
1
2
>>> importlib.machinery.all_suffixes()
['.py', '.pyw', '.pyc', '.pyd']
следует, что import таки не видит модули с dll расширением, и, похоже, жутковатый ExtensionFileLoader - единственный способ загрузить такой модуль (внутри он использует встроенный _imp.load_dynamic(modulename, path))

Python
1
2
3
from importlib.machinery import ExtensionFileLoader
 
addList = ExtensionFileLoader("addList", r"c:\addList.dll").load_module()
(проще поменять расширение)
1
OlafNestandart
54 / 54 / 31
Регистрация: 24.10.2016
Сообщений: 186
12.02.2017, 00:19 12
Цитата Сообщение от Avazart Посмотреть сообщение
А есть ли способ загрузить с dll расширением, ведь как то грузятся длл-ки от Qt ?
Можно любую дллку грузить через ctypes, но для того чтоб ее заставить нормально работать, нужно как минимум описать на питоне функции, экспортируемые из длл, и структуры, используемые этими функциями. Так к примеру работают биндинг SDL и wxPython.
0
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
12.02.2017, 01:04  [ТС] 13
Цитата Сообщение от OlafNestandart Посмотреть сообщение
Можно любую дллку грузить через ctypes,
Да но как мне кажется очень морочно в сравнении с API.
Кроме того Qt это С++ библиотека.
0
OlafNestandart
54 / 54 / 31
Регистрация: 24.10.2016
Сообщений: 186
12.02.2017, 10:28 14
Цитата Сообщение от Avazart Посмотреть сообщение
Да но как мне кажется очень морочно в сравнении с API.
Кроме того Qt это С++ библиотека.
Ну так и wxWidgets тоже C++ библиотека. Люди просто заморочились с враперами через ctypes, где вручную писали, где генерили через swig - ctypes поддерживает thiscall, имена можно продеманглить, что еще нужно для счастья. Но да, геморно это.
0
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
12.02.2017, 15:44  [ТС] 15
Ну в Qt много своих типов например QString которые не являются "простыми", как я понимаю с этим ctypes не справиться.
0
12.02.2017, 15:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2017, 15:44

Cx_freeze python error in main script как исправить- Python
Пытался создать из .py .exe , но при запуске .exe получаю ошибку вот код...

Как из Python скрипта выполнить другой python скрипт?
Как из Python скрипта выполнить другой python скрипт? Если он находится в той...

Отладчик для Python 3.x
Ищу отладчик для Python 3.x . Стандартный не подходит. Нашел pudb, но при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru