py2exe для генерации dll? - PullRequest
       26

py2exe для генерации dll?

13 голосов
/ 15 февраля 2009

Есть ли способ использовать py2exe или какой-либо другой метод для создания dll-файлов вместо exe-файлов?

Я бы хотел создать обычную win32 dll с обычными функциями, но эти функции были бы написаны на python вместо c ++.

Ответы [ 5 ]

6 голосов
/ 01 марта 2009

Я думаю, вы могли бы решить эту проблему, взломав:

  • Взгляните на модуль zipextimporter в py2exe. Помогает в импорте pyd-файлов из zip.
  • Используя это, вы можете загрузить выходной файл py2exe в свое собственное приложение / dll, используя raw python-api. (Используйте boost :: python, если можете и хотите)
  • И, так как выходной файл py2exe - это zip, вы можете присоединить его в конце вашей dll, сделав все это еще более интегрированным. (Старый трюк, который работает и с jar-файлами.)

Не проверено, но я думаю, что теория обоснована.

По сути, вы переопределяете main () выходного исполняемого файла py2exe в вашей dll.

5 голосов
/ 15 февраля 2009

Я сомневаюсь, что py2exe делает это, поскольку он основан на обеспечении загрузочного .exe, который выкатывает интерпретатор python и запускает его.

Но почему бы просто не встроить Python в код C и скомпилировать этот код в виде DLL?

4 голосов
/ 15 февраля 2009

Мне не известно, что py2exe может это сделать, так как считаю, что на самом деле он не делает объектные символы из вашего кода Python, а просто встраивает скомпилированный байт-код в исполняемый файл со средой выполнения Python) .

Создание нативной библиотеки может потребовать немного больше работы (для определения интерфейса C / C ++ к вещам) с API-интерфейсом Python-C. Для этого может быть несколько проще использовать Elmer .

1 голос
/ 02 октября 2014

Для потомков я смог использовать Elmer , чтобы недавно успешно создать пригодную для использования DLL. На их сайте есть пример создания оболочки DLL, которая загружает код Python . Это довольно круто, потому что вы можете изменить код python на лету, чтобы изменить поведение DLL для отладки.

К сожалению, для меня я хотел портативную DLL, которая работала бы без установки python. Эта часть не совсем сработала из коробки. Вместо того, чтобы повторять все шаги, вот ссылка на ответ с шагами, которые я предпринял: https://stackoverflow.com/a/24811840/3841168. Я должен был распространять python27.dll, elmer.dll и пару .pyd вместе с моим .dll; Также требовалось соответствующее время выполнения .net, так как python27.dll обычно не является статически связанным. Может быть какой-то способ обойтись, включая загрузку библиотек dll, но я не возражал распространять несколько библиотек DLL, поэтому я не слишком углублялся в это.

0 голосов
/ 03 июня 2014

Похоже, что можно генерировать COM DLL из py2exe:

http://www.py2exe.org/index.cgi/Py2exeAndCtypesComDllServer

  23     my_com_server_target = Target(
  24     description = "my com server",
  25     # use module name for ctypes.com dll server
  26     modules = ["dir.my_com_server"],
  27     # the following line embeds the typelib within the dll
  28     other_resources = [("TYPELIB", 1, open(r"dir\my_com_server.tlb", "rb").read())],
  29     # we only want the inproc (dll) server
  30     create_exe = False
  31     )
...