Найти - Пользователи
Полная версия: Вызов функции из своей DLL из проекта на Python
Начало » Python для новичков » Вызов функции из своей DLL из проекта на Python
1
tumanovalex
Хотел бы по вызову из пункта меню File вызвать из MyDll функцию GetArray(char* str, float a), которая принимает название файла, читает данные из файла и помещает их в массив. В конечном итоге эти данные нужно поместить в таблицу, но для начала хотя бы для проверки правильности работы с DLL просто напечатать в поле ввода. На http://slil.ru/27437052 находятся заготовка задачи, dll, код dll на С и данные. DLL проверял, из проекта на LabView функция успешно вызывалась. Помогите, пожалуйста.
pyuser
Для начала:
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")
Андрей Светлов
pyuser
Твердая пятерка. Особенно за комментарии по выделению/освобождению памяти.
tumanovalex
Огромное спасибо за подробные объяснения и разбор моего примера! На питоне мне нужно создавать фронтэнды для своих программ, они достаточно сложные и написаны как консольные приложения на С (без С++). Мне нужно будет их перевести в DLL (прикрепленная - только для примера, не реальная) и я очень боялся, что на питоне вызов функций из DLL может не получиться. Теперь я понял, что все должно получиться, нужно садиться изучать питон и его механизмы вызова функций из DLL, тогда все мои консольные приложения будут “хорошо выглядеть”.
tumanovalex
Забыл спросить. По первому пункту ответа: 1. Вы забываете о необходимости указания кодировки файла. Имеется в виду питоновский файл? Что нужно указать?
pyuser
Андрей Светлов
pyuser
Твердая пятерка.
Спасибо.
pyuser
tumanovalex
Забыл спросить. По первому пункту ответа: 1. Вы забываете о необходимости указания кодировки файла. Имеется в виду питоновский файл? Что нужно указать?
первой строкой в скрипте желательно указывать кодировку, об этом везде пишут, сам Python говорит об этом при запуске скриптов (если где либо в скрипте используется язык отличный от английского)
# -*- mode: python; coding: cp1251 -*-
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB