2009-02-15 4 views
11

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

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

ответ

6

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

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

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

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

+0

py2exe имеет 1 выходный путь кода, главный(). Есть ли у вас мысли о том, как указать экспортированные функции/классы с помощью только кода python? Предполагая, что я сделал какую-то аналогичную утилиту py2dll –

+0

Нет. Я не думаю, что вы можете это сделать, не написав C.Я думал, что вы будете запускать py2exe, как обычно, и использовать его выход из библиотеки, но создайте свою собственную dll, которая экспортирует функцию my_pymain, которая делает что-то похожее на исполняемые файлы py2exe. Вы должны иметь возможность украсть этот код из py2exe. – Macke

4

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

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

5

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

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

0

Похоже, можно сгенерировать 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 ) 
1

для потомков, я был в состоянии использовать Elmer успешно генерировать полезную DLL в последнее время. Их сайт has an example of building a DLL wrapper that loads python code. Это довольно круто, потому что вы можете изменить код python «на лету», чтобы изменить поведение DLL для отладки.

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

Смежные вопросы