Как я могу вызвать DLL из скриптового языка?

У меня есть сторонний продукт, эмулятор терминала, который предоставляет DLL, которая может быть связана с программой C, чтобы в основном автоматизировать управление этим продуктом (отправлять нажатия клавиш, определять, что на экране, и т. д.).

Я хочу использовать его на языке сценариев (мне нравится Python и немного меньше - Perl), чтобы нам не приходилось компилировать и отправлять исполняемые файлы нашим клиентам всякий раз, когда обнаруживается проблема.

Мы также хотим, чтобы клиенты могли писать свои собственные сценарии, используя наши в качестве базовых, и им не понравится идея написания и компиляции кода C.

Какой хороший способ заставить Python / Perl взаимодействовать с Windows DLL? Моей первой мыслью было написать серверную программу и связать с ней скрипт Python через TCP, но должно быть более простое решение.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
9
0
3 762
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Один из способов вызвать библиотеки C из Python - использовать ctypes:

>>> from ctypes import *
>>> windll.user32.MessageBoxA(None, "Hello world", "ctypes", 0);

В Perl Win32 :: API - это простой способ взаимодействия с библиотеками DLL. Также существует Встроенный :: C, если у вас есть доступ к компилятору и заголовкам окон.

Perl XSUB также может создавать интерфейс между Perl и C.

Добавьте XS, и мы получим победителя.

Brad Gilbert 27.10.2008 21:08

В Perl P5NCI также будет делать это, по крайней мере, в некоторых случаях. Но мне кажется, что все, что вы используете, что напрямую управляет взаимодействием с dll, будет недружелюбно для пользователя, и если у вас будет удобная для пользователя (сценариста?) Оболочка, это может быть также модуль XS.

Думаю, я не вижу значимого различия между «компилировать и отправлять исполняемые файлы» и «компилировать и отправлять скрипты».

Для Python вы можете скомпилировать расширение, которое ссылается на DLL, чтобы в Python вы могли просто импортировать его как обычный модуль. Вы можете сделать это вручную, используя такую ​​библиотеку, как Boost.Python, или используя такой инструмент, как SWIG (который также поддерживает Perl и другие языки сценариев) для автоматического создания оболочки.

Функция Python Py_InitModule API позволяет создавать модуль из функций c / C++, которые затем можно вызывать из Python.

Для реализации требуется около дюжины строк кода c / C++, но написать такой код довольно просто:

https://python.readthedocs.org/en/v2.7.2/exnding/exnding.html#the-module-s-method-table-and-initialization-function

Редактор Зевс, который я написал, использует это приложение для написания макросов Зевс на Python, и он работает очень хорошо.

если вы написали в своем ответе пример «привет, мир» вместо ссылки на страницу, которая нецелесообразна, вы не будете последним из этого списка ответов :-)

Davide 14.11.2009 08:53

Ссылка, которую я предоставил, уже содержит простой пример «привет, мир». По предоставленной ссылке: «Пример можно найти в файле Demo / embed / demo.c в дистрибутиве исходного кода Python».

jussij 17.11.2009 09:18

Другие вопросы по теме