Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 10, 2009 15:23:46

tumanovalex
От:
Зарегистрирован: 2009-04-04
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции из своей DLL из проекта на Python

Хотел бы по вызову из пункта меню File вызвать из MyDll функцию GetArray(char* str, float a), которая принимает название файла, читает данные из файла и помещает их в массив. В конечном итоге эти данные нужно поместить в таблицу, но для начала хотя бы для проверки правильности работы с DLL просто напечатать в поле ввода. На http://slil.ru/27437052 находятся заготовка задачи, dll, код dll на С и данные. DLL проверял, из проекта на LabView функция успешно вызывалась. Помогите, пожалуйста.



Офлайн

#2 Апрель 11, 2009 03:56:26

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Вызов функции из своей DLL из проекта на Python

Для начала:
1. Вы забываете о необходимости указания кодировки файла :(
2. практика работы с wxFrame показывает, что для главного окна целесообразно вызывать Destroy руками, т.е

# в конструкторе делаем привязку к событию        
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

# ну и сама функция
def OnCloseWindow (self, event) :
# сначала убираем свой собственный мусор,
# если таковой имеется, а затем...
self.Destroy()
что касается ctypes, рекомендую посмотреть вот это: http://python.net/crew/theller/ctypes/tutorial.html

ну и вот пример вызова Вашей функции
from ctypes import *

GetArray = cdll.mydll.GetArray

def get_array () :
# память под массив должна выделять вызывающая программа
# Ваша библиотека не предоставляет средств для определения размера данных,
# перепешите функцию, скажем следующим образом:
# если передается нулевой указатель на массив - значит нужно вернуть общий размер
# данных, в противном случае - размер реально прочитанных данных

# это у Вас пока не предусмотрено :)
# size = GetArray("Данные.txt", None)
# имеем 12 строк (пришлось залезть в файл и посчитать) по три столбца,
# значит размер массива:
size = 24 # 12 * 2 в( Вашем файле их всего 2 :()
# выделяем память под массив
dataBuffer = (size * c_float)()
# вызываем Вашу функцию
GetArray("Данные.txt", byref(dataBuffer))
# каким-то образом проверяем все ли считано и, ели нет ошибок продолжаем
rowCount = size / 2 # число столбцов известно заранее (в Вашем файле их 2 :()
for i in xrange(rowCount) :
print(u"строка %02d:" % i, end=" ")
for j in xrange(2) :
print(dataBuffer[i*2+j], end=" | ")
print(end="\n")



Офлайн

#3 Апрель 11, 2009 08:16:33

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вызов функции из своей DLL из проекта на Python

pyuser
Твердая пятерка. Особенно за комментарии по выделению/освобождению памяти.



Офлайн

#4 Апрель 11, 2009 09:38:09

tumanovalex
От:
Зарегистрирован: 2009-04-04
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции из своей DLL из проекта на Python

Огромное спасибо за подробные объяснения и разбор моего примера! На питоне мне нужно создавать фронтэнды для своих программ, они достаточно сложные и написаны как консольные приложения на С (без С++). Мне нужно будет их перевести в DLL (прикрепленная - только для примера, не реальная) и я очень боялся, что на питоне вызов функций из DLL может не получиться. Теперь я понял, что все должно получиться, нужно садиться изучать питон и его механизмы вызова функций из DLL, тогда все мои консольные приложения будут “хорошо выглядеть”.



Офлайн

#5 Апрель 11, 2009 09:41:11

tumanovalex
От:
Зарегистрирован: 2009-04-04
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции из своей DLL из проекта на Python

Забыл спросить. По первому пункту ответа: 1. Вы забываете о необходимости указания кодировки файла. Имеется в виду питоновский файл? Что нужно указать?



Офлайн

#6 Апрель 12, 2009 17:09:26

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Вызов функции из своей DLL из проекта на Python

Андрей Светлов
pyuser
Твердая пятерка.
Спасибо.



Офлайн

#7 Апрель 12, 2009 17:14:09

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Вызов функции из своей DLL из проекта на Python

tumanovalex
Забыл спросить. По первому пункту ответа: 1. Вы забываете о необходимости указания кодировки файла. Имеется в виду питоновский файл? Что нужно указать?
первой строкой в скрипте желательно указывать кодировку, об этом везде пишут, сам Python говорит об этом при запуске скриптов (если где либо в скрипте используется язык отличный от английского)
# -*- mode: python; coding: cp1251 -*-



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version