code python python-c-extension pyd

python - code - cython



Extensión de Python C: ¿Usar la extensión PYD o DLL? (4)

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?


De acuerdo con el paso Creación de su propio proyecto (Paso 7 del "Enfoque del libro de cocina") de Construir C y C ++ Extensiones 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 razón por la que python en 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


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. Echa un vistazo a este artículo , muestra muchos ejemplos simples en Windows y Linux.



Suponiendo que su extensión de Python foo está destinada a 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 documentation .

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.