2009-02-15 13 views
11

¿Hay alguna manera de usar py2exe o algún otro método para generar archivos dll en lugar de archivos exe?py2exe para generar dlls?

Quisiera crear básicamente un dll win32 normal con funciones normales, pero estas funciones se codificarían en python en lugar de C++.

Respuesta

6

Creo que se podría solucionar esto haciendo un poco de piratería:

  • Tome una mirada en el módulo de zipextimporter en py2exe. Ayuda con la importación de archivos pyd desde un zip.
  • Utilizando eso, es posible que pueda cargar el archivo de salida de py2exe en su propia aplicación/dll usando raw python-api. (Utilice boost :: python si puede y quiere)
  • Y, dado que el archivo de salida de py2exe es un zip, podría adjuntarlo al final de su dll, haciendo que todo esté aún más integrado. (Viejo truco que también funciona con archivos .jar)

No probado, pero creo que la teoría es sólida.

Esencialmente, usted vuelve a implementar main() del ejecutable de salida de py2exe en su dll.

+0

py2exe tiene 1 código de salida, el principal(). ¿Tiene alguna idea sobre la forma de especificar las funciones/clases exportadas con el código solo python? Asumiendo que hice algún tipo de utilidad similar, py2dll –

+0

No. No creo que pueda hacerlo sin escribir algo de C.Pensaba que ejecutaría py2exe como de costumbre y usaría su salida de biblioteca, pero codificaría su propio dll, que exporta una función 'my_pymain' que hace algo similar a los ejecutables de py2exe. Debería poder robar ese código de py2exe. – Macke

4

No sé si py2exe es capaz de hacer eso, ya que creo que en realidad no hace símbolos de objetos de su código de Python, sino que simplemente incorpora el código de bytes compilado en un ejecutable con el tiempo de ejecución de Python).

Crear una biblioteca nativa puede requerir un poco más de trabajo (para definir la interfaz C/C++ a las cosas) con la API de Python-C. Puede ser un poco más fácil usar Elmer para eso.

5

Dudo que py2exe haga esto, ya que se trata de una arquitectura que proporciona un archivo bootstrapping .exe que despliega el intérprete de python y lo ejecuta.

¿Pero por qué no simplemente incrusta Python en código C y compila ese código como una DLL?

0

Parece que es posible generar una DLL COM desde 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

Para la posteridad, yo era capaz de utilizar Elmer para generar con éxito una DLL utilizable recientemente. Su sitio has an example of building a DLL wrapper that loads python code. Es muy bueno porque puede cambiar el código python sobre la marcha para cambiar el comportamiento de la DLL para la depuración.

Desafortunadamente, para mí, quería una DLL portable que funcionara sin instalar Python. Esa parte no funcionó del todo. En lugar de repetir todos los pasos, aquí hay un enlace a la respuesta con los pasos que tomé: https://stackoverflow.com/a/24811840/3841168. Tuve que distribuir python27.dll, elmer.dll y un par de .pyd junto con mi .dll; también se necesitaba un tiempo de ejecución de .net apropiado, ya que python27.dll generalmente no está vinculado estáticamente. Puede haber una forma de evitarlo incluyendo una gran cantidad de dll, pero no me importó distribuir varias DLL, así que no profundicé demasiado.