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

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

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

Ответ 1

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

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

Не тестировалось, но я думаю, что теория звучит.

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Похоже, что можно создать 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     )