Расширение Python C: использовать расширение PYD или DLL? - PullRequest
23 голосов
/ 25 ноября 2011

У меня есть расширение Python, написанное на C, и мне интересно, стоит ли мне использовать расширение файла DLL или PYD под Windows. (А что бы я использовал в Linux?)

Есть ли различия (кроме имени файла)?

Я нашел неофициальную статью . Это секрет Пик? Почему я не могу найти официальную статью на эту тему?

Ответы [ 4 ]

22 голосов
/ 12 декабря 2011

pyd-файлы - это просто dll-файлы, готовые для импорта на python.

Чтобы отличить их от обычных библиотек, я рекомендую .pyd, а не .dll в Windows.

Вот официальный документ по этому вопросу:

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

6 голосов
/ 15 декабря 2011

В соответствии с шагом Создание собственного проекта (Шаг 7 из «Подхода к поваренной книге») Построение расширений C и C ++ для Windows

Выходной файл должен называться spam.pyd (в режиме выпуска) или spam_d.pyd (в режиме отладки).Расширение .pyd было выбрано, чтобы избежать путаницы с системной библиотекой spam.dll, к которой ваш модуль может быть интерфейсом Python.

Таким образом, файл .pyd - это всего лишь DLL, переименованная для экономии на путанице.

Однако в Linux, исходя из опыта, кажется, что вам нужно использовать расширение .so для библиотек Python.Это просто стандартная библиотека Unix.Я не могу предоставить источник или причину, почему Python в Linux не меняет расширение файла, однако я могу показать вам, как это продемонстрировать.В оболочке выполните следующее:

python -vv
>>> import fakemodule

Вы заметите, что вывод показывает:

пытается /usr/lib/python2.5/site-packages/fakemodule.so

6 голосов
/ 25 ноября 2011

Предполагая, что ваше расширение Python foo предназначено для использования в качестве модуля, доступного через import foo, вам не нужно знать, какое расширение имени файла должно быть в какой операционной системе.Вы просто используете distutils.Вы получите .pyd для Windows и .so для Linux и т. Д. Прочитайте эту документацию .

Обновление в ответ на комментарий @gecko "" "import foo работает с обоими типами расширений: dll и pyd. Расширение здесь не имеет значения ..." "":

Для меня (Python 2.7.1, Windows 7) python -vv показывает только поиск расширений pyd, py, pyw и pyc (в этом порядке).Если у меня foo.pyd в C:\python27\lib\site-packages, import foo работает.Если я переименую этот файл в foo.dll, import foo завершится неудачей.

2 голосов
/ 15 декабря 2011

В Windows вы можете использовать * .pyd для импорта напрямую из Python import foo, но для * .dll вы должны использовать это:

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

Если вы хотите узнать, какие функции экспортируются в этомИспользуем этот инструмент

ОБНОВЛЕНИЕ: Вот пример использования distutils и SWIG для создания расширения.Проверьте эту статью , в ней показано много простых примеров под Windows и Linux.

...