Python C extension: Use extension PYD or DLL?

白昼怎懂夜的黑 提交于 2019-11-27 20:17:37

问题


I have a Python extension written in C and I wonder if I should use the file extension DLL or PYD under Windows. (And what would I use in Linux?)

Are there any differences (besides the filename)?

I found an unofficial article. Is this the secret of pyc? Why can't I find any official article on this topic?


回答1:


pyd files are just dll files ready for python importing.

To distinguish them from normal dlls, I recommend .pyd not .dll in windows.

Here is the official doc about this issue:

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




回答2:


According to the Creating Your Own Project step (Step 7 of "The Cookbook Approach") of Building C and C++ Extensions on Windows

The output file should be called spam.pyd (in Release mode) or spam_d.pyd (in Debug mode). The extension .pyd was chosen to avoid confusion with a system library spam.dll to which your module could be a Python interface.

So a .pyd file is just a DLL renamed to save on confusion.

On linux however, speaking from experience it seems that you need to use the .so extension for python dlls. This is just a standard unix shared library. I can't provide a source or reason for why python on linux does not change the file extension, however I can show you how to demonstrate it. At the shell, run the following:

python -vv
>>> import fakemodule

You'll notice that the output shows:

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




回答3:


Presuming your Python extension foo is intended to be used as a module, accessible via import foo, you don't need to know what the filename extension should be on what operating system. You just use distutils. You will get a .pyd on Windows, and a .so on Linux etc. Read this documentation.

Update in response to comment by @gecko """import foo is working both both extension types: dll and pyd. The extension does not matter here... """:

For me (Python 2.7.1, Windows 7), python -vv shows only pyd, py, pyw and pyc extensions (in that order) being searched. If I have foo.pyd in C:\python27\lib\site-packages, import foo works. If I rename that file to foo.dll, import foo fails.




回答4:


In Windows you can use *.pyd to be imported directly from Python import foo but for *.dll you should use this:

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()

If you want to explore what functions are exported in this Dll use this tool

UPDATE: Here's an example using distutils and SWIG to build the extension. Check this article out, it shows many simple examples under Windows and Linux.



来源:https://stackoverflow.com/questions/8262884/python-c-extension-use-extension-pyd-or-dll

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!