私はCで書かれたPython拡張機能を持っていますが、Windowsでファイル拡張子DLLまたはPYDを使用する必要があるのでしょうか。(そして私はLinuxで何を使うでしょうか?)
(ファイル名以外に)違いはありますか?
非公式の記事を見つけました。これがpycの秘密ですか?このトピックに関する公式記事が見つからないのはなぜですか?
私はCで書かれたPython拡張機能を持っていますが、Windowsでファイル拡張子DLLまたはPYDを使用する必要があるのでしょうか。(そして私はLinuxで何を使うでしょうか?)
(ファイル名以外に)違いはありますか?
非公式の記事を見つけました。これがpycの秘密ですか?このトピックに関する公式記事が見つからないのはなぜですか?
pydファイルは、Pythonインポートの準備ができている単なるdllファイルです。
それらを通常のdllと区別するために、Windowsでは.dllではなく.pydをお勧めします。
この問題に関する公式ドキュメントは次のとおりです。
http://docs.python.org/faq/windows.html#is-a-pyd-file-the-same-as-a-dll
WindowsでCおよびC++拡張機能を構築するための独自のプロジェクトの作成ステップ(「クックブックアプローチ」のステップ7)によると
出力ファイルは、spam.pyd(リリースモードの場合)またはspam_d.pyd(デバッグモードの場合)と呼ばれる必要があります。拡張子.pydは、モジュールがPythonインターフェイスになる可能性のあるシステムライブラリspam.dllとの混同を避けるために選択されました。
したがって、.pydファイルは、混乱を避けるために名前が変更されたDLLにすぎません。
ただし、Linuxでは、経験から言えば、Pythondllには.so拡張子を使用する必要があるようです。これは単なる標準のUNIX共有ライブラリです。Linux上のPythonがファイル拡張子を変更しない理由やソースを提供することはできませんが、それを示す方法を紹介することはできます。シェルで、次を実行します。
python -vv
>>> import fakemodule
出力には次のように表示されます。
/usr/lib/python2.5/site-packages/fakemodule.soを試します
Python拡張機能foo
がモジュールとして使用されることを意図しており、を介してアクセスできると仮定するimport foo
と、ファイル名拡張子がどのオペレーティングシステムにあるべきかを知る必要はありません。を使用するだけdistutils
です。Windowsでは.pydを、Linuxなどでは.soを取得します。このドキュメントをお読みください。
@geccoによるコメントに応じて更新
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
失敗します。
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での多くの簡単な例が示されています。