web-dev-qa-db-ja.com

Python C拡張:拡張PYDまたはDLLを使用しますか?

私はPython拡張子がCで書かれていて、Windowsでファイル拡張子DLLまたはPYDを使用する必要があるかどうか疑問に思っています。Linuxで何を使用しますか?)

(ファイル名以外に)違いはありますか?

非公式記事 を見つけました。これはpycの秘密ですか?このトピックに関する公式の記事が見つからないのはなぜですか?

25
gecco

pydファイルは、pythonインポートの準備ができているdllファイルです。

それらを通常のdllと区別するために、Windowsでは.dllではなく.pydをお勧めします。

この問題に関する公式ドキュメントは次のとおりです。

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

24
zchenah

Creating Your Own Projectステップ(「The Cookbook Approach」のステップ7)の Building C and C++ Extensions onウィンドウズ

出力ファイルは、spam.pyd(リリースモードの場合)またはspam_d.pyd(デバッグモードの場合)と呼ばれます。拡張子.pydは、モジュールがPythonインターフェイスである可能性があるシステムライブラリspam.dllとの混乱を避けるために選択されました。

したがって、.pydファイルは単なるDLL混乱を避けるために名前が変更されています。

ただし、Linuxでは、経験から言えば、python dllsの場合は.so拡張子を使用する必要があります。これは単なる標準のUNIX共有ライブラリです。ソースや理由を提供できません。理由pythonはファイル拡張子を変更しませんが、それを示す方法を示すことができます。シェルで次のコマンドを実行します。

python -vv
>>> import fakemodule

出力には次のように表示されます。

/usr/lib/python2.5/site-packages/fakemodule.soを試す

7
obmarg

Python拡張子fooは、import fooを介してアクセス可能なモジュールとして使用することを目的としているため、ファイル名拡張子が何であるかを知る必要はありません。どのオペレーティングシステム。distutilsを使用するだけです。Windowsでは.pyd、Linuxでは.soなどが表示されます。これをお読みください ドキュメント

Update@gecko "" "import fooによるコメントへの応答で、dllとpydの両方の拡張タイプが機能しています。拡張機能はここでは重要ではありません。 。 "" ":

私(Python 2.7.1、Windows 7)の場合、python -vvは、検索されているpyd、py、pyw、およびpyc拡張のみをこの順序で表示します。 foo.pydC:\python27\lib\site-packagesがある場合、import fooは機能します。そのファイルの名前をfoo.dllに変更すると、import fooが失敗します。

6
John Machin

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でどの関数がエクスポートされるかを調べたい場合は このツール を使用してください

更新:これはdistutilsと [〜#〜] swig [〜#〜] を使用して拡張機能をビルドする例です。チェック この記事 アウト、WindowsおよびLinuxでの多くの簡単な例を示します。

3
Abdurahman