Подтвердить что ты не робот

Расширение Python C: используйте расширение PYD или DLL?

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

Есть ли какие-либо отличия (помимо имени файла)?

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

4b9b3361

Ответ 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.