Extensión Python C: ¿Usar extensión PYD o DLL?

Tengo una extensión de Python escrita en C y me pregunto si debería usar la extensión de archivo DLL o PYD en Windows. (¿Y qué usaría en Linux?)

¿Hay alguna diferencia (además del nombre de archivo)?

Encontré un artículo no oficial . ¿Es este el secreto de pyc? ¿Por qué no puedo encontrar ningún artículo oficial sobre este tema?

Los archivos pyd son archivos dll listos para la importación de python.

Para distinguirlos de los dll normales, sugiero, use pyd no dll en windows.

Existe el documento oficial sobre este tema:

http://docs.python.org/faq/windows.html#is-a-pyd-file-the-same-as-a-dll

De acuerdo con el paso Creación de su propio proyecto (Paso 7 de “El Enfoque de los Libros de Cocina”) de Creación de Extensiones C y C ++ en Windows

El archivo de salida debe llamarse spam.pyd (en modo Release) o spam_d.pyd (en modo debug). La extensión .pyd se eligió para evitar confusiones con una biblioteca del sistema spam.dll para la cual su módulo podría ser una interfaz Python.

Por lo tanto, un archivo .pyd es solo un DLL cuyo nombre se cambia para evitar confusiones.

Sin embargo, en linux, hablando por experiencia, parece que necesitas usar la extensión .so para las dlls de Python. Esto es sólo una biblioteca compartida estándar de Unix. No puedo proporcionar una fuente o una razón por la que python on linux no cambie la extensión del archivo, sin embargo, puedo mostrarle cómo demostrarlo. En el shell, ejecute lo siguiente:

python -vv >>> import fakemodule 

Notarás que la salida muestra:

intentando /usr/lib/python2.5/site-packages/fakemodule.so

Suponiendo que su extensión de Python foo está diseñada para ser utilizada como un módulo, accesible a través de import foo , no necesita saber cuál debe ser la extensión del nombre de archivo en qué sistema operativo. Sólo usas distutils . Obtendrá un .pyd en Windows y un .so en Linux, etc. Lea esta documentación .

La actualización en respuesta al comentario de @gecko “” “import foo funciona con ambos tipos de extensión: dll y pyd. La extensión no importa aquí …” “”:

Para mí (Python 2.7.1, Windows 7), python -vv muestra solo las extensiones pyd, py, pyw y pyc (en ese orden) que se están buscando. Si tengo foo.pyd en C:\python27\lib\site-packages , import foo works. Si cambio el nombre de ese archivo a foo.dll , la import foo falla.

En Windows puede usar * .pyd para importar directamente desde Python import foo pero para * .dll debe usar esto:

 from ctypes import cdll #load dll file , the file in the same .py file location or enter the full path mylib=cdll.LoadLibrary("foo.dll") #call a function from this dll (c-ext) ReturnedValue=mylib.FunctionName() 

Si desea explorar qué funciones se exportan en esta Dll use esta herramienta

ACTUALIZACIÓN: Aquí hay un ejemplo usando distutils y SWIG para construir la extensión. Revisa este artículo , muestra muchos ejemplos simples en Windows y Linux.