Расширение Python C: используйте расширение PYD или DLL?
У меня есть расширение Python, написанное на C, и мне интересно, следует ли использовать расширение DLL файлов или PYD под Windows. (И что я буду использовать в Linux?)
Есть ли какие-либо отличия (помимо имени файла)?
Я нашел неофициальную статью. Это секрет pyc?
Почему я не могу найти какую-либо официальную статью по этой теме?
Ответы
Ответ 1
pyd файлы - это просто dll файлы, готовые для импорта на python.
Чтобы отличить их от обычных dll, я рекомендую .pyd, а не .dll в windows.
Вот официальный документ по этому вопросу:
http://docs.python.org/faq/windows.html#is-a-pyd-file-the-same-as-a-dll
Ответ 2
Предполагая, что расширение 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
завершится сбой.
Ответ 3
В соответствии с шагом "Создание собственного проекта" (шаг 7 "Подход поваренной книги" ) Building C и С++ Extensions в Windows
Выходной файл должен быть вызван spam.pyd(в режиме Release) или spam_d.pyd(в режиме отладки). Расширение .pyd было выбрано так, чтобы избежать путаницы с системной библиотекой spam.dll, к которой ваш модуль может быть интерфейсом Python.
Так что .pyd файл - это просто переименованная DLL, чтобы сэкономить на путанице.
В linux, однако, исходя из опыта, кажется, что вам нужно использовать расширение .so для dll python. Это стандартная общая библиотека unix. Я не могу предоставить источник или причину того, почему python на linux не изменяет расширение файла, однако я могу показать вам, как его продемонстрировать. В командной оболочке выполните следующее:
python -vv
>>> import fakemodule
Вы заметите, что на выходе отображается:
try/usr/lib/python2.5/site-packages/fakemodule.so
Ответ 4
В 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()
Если вы хотите изучить, какие функции экспортируются в этой Dll, используйте этот инструмент
UPDATE:
Вот пример использования distutils и SWIG для создания расширения. Проверьте эту статью, она показывает много простых примеров под Windows и Linux.