13

Is there a way using py2exe or some other method to generate dll files instead of exe files?

I would want to basically create a normal win32 dll with normal functions but these functions would be coded in python instead of c++.

Brian R. Bondy
  • 339,232
  • 124
  • 596
  • 636

5 Answers5

6

I think you could solve this by doing some hacking:

  • Take a look at the zipextimporter module in py2exe . It helps with importing pyd-files from a zip.
  • Using that, you might be able to load py2exe's output file in your own app/dll using raw python-api. (Use boost::python if you can and want)
  • And, since py2exe's outputfile is a zip, you could attach it at the end of your dll, making the whole thing even more integrated. (Old trick that works with jar-files too.)

Not tested, but I think the theory is sound.

Essentially, you reimplement py2exe's output executable's main() in your dll.

Macke
  • 24,812
  • 7
  • 82
  • 118
  • py2exe has 1 code output path, the main(). Do you have any thoughts on a way to specify the exported functions/classes with python only code? Assuming I made some sort of similar utility py2dll – Brian R. Bondy Feb 28 '09 at 23:43
  • No. I don't think you can do it without writing some C. I was thinking that you'd run py2exe as usual, and use it's library output, but code your own dll, which exports a 'my_pymain' function that does something similar to py2exe's executables. You should be able to steal that code from py2exe. – Macke Mar 01 '09 at 00:23
5

I doubt that py2exe does this, as it's architectured around providing a bootstrapping .exe that rolls out the python interpreter and runs it.

But why not just embed Python in C code, and compile that code as a DLL?

Eli Bendersky
  • 263,248
  • 89
  • 350
  • 412
4

I am not aware of py2exe being able to do that, as I believe that it does not actually make object symbols out of your Python code, but just embeds the compiled byte-code in an executable with the Python runtime).

Creating a native library may require a bit more work (to define the C/C++ interface to things) with the Python-C API. It may be somewhat easier using Elmer for that.

Tom Alsberg
  • 6,873
  • 3
  • 28
  • 14
1

For posterity, I was able to use Elmer to successfully generate a usable DLL recently. Their site has an example of building a DLL wrapper that loads python code. It is pretty cool because you can change the python code on the fly to change the DLL behavior for debugging.

Unfortunately, for me, I wanted a portable DLL that would work without installing python. That part didn't didn't quite work out of the box. Rather than repeating all the steps, here is a link to the answer with the steps I took: https://stackoverflow.com/a/24811840/3841168. I did have to distribute python27.dll, elmer.dll and a couple of .pyd's along with my .dll; an appropriated .net runtime was also needed since the python27.dll is not usually statically linked. There may be some way around including a boatload of dll's, but I didn't mind distributing multiple DLLs, so I didn't dig into it too much.

Community
  • 1
  • 1
A.Wallen
  • 41
  • 7
0

It looks like it is possible to generate a COM DLL from 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     )
denfromufa
  • 5,610
  • 13
  • 81
  • 138