DLL
内部からファイルを使用する最も簡単な方法は何Python
ですか?
具体的には、機能を公開するための追加のラッパーコードを記述せずに、これをどのように行うことができますか?C++
Python
ネイティブPython
機能は、サードパーティのライブラリを使用するよりも強く推奨されます。
DLL
内部からファイルを使用する最も簡単な方法は何Python
ですか?
具体的には、機能を公開するための追加のラッパーコードを記述せずに、これをどのように行うことができますか?C++
Python
ネイティブPython
機能は、サードパーティのライブラリを使用するよりも強く推奨されます。
回答:
使いやすくするために、ctypesが適しています。
次のctypesの例は、Python 2.5で記述した実際のコードからの抜粋です。これは、あなたが求めることを行うために私が見つけた最も簡単な方法です。
import ctypes
# Load DLL into memory.
hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")
# Set up prototype and parameters for the desired function call.
# HLLAPI
hllApiProto = ctypes.WINFUNCTYPE (
ctypes.c_int, # Return type.
ctypes.c_void_p, # Parameters 1 ...
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p) # ... thru 4.
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),
# Actually map the call ("HLLAPI(...)") to a Python name.
hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)
# This is how you can actually call the DLL function.
# Set up the variables and call the Python name with them.
p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p (sessionVar)
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))
ctypes
スタッフは、(すべてのC型のデータ型を有しint
、char
、short
、void*
、など)と値または参照によって渡すことができます。私の例ではそうではありませんが、特定のデータ型を返すこともできます(HLL APIは、参照によって渡される変数を変更することによって値を返します)。
上記の特定の例に関して言えば、IBMのEHLLAPIはかなり一貫したインターフェースです。
すべてのコールは4つの、ボイドポインタを渡す(EHLLAPIは、第四パラメータを通じてへのポインタ戻りコードバックを送信しint
、私が指定している間、そうするint
IBMのマニュアルに従って戻り値の型として、私は安全にそれを無視することができます)ここに。つまり、関数のCバリアントは次のようになります。
int hllApi (void *p1, void *p2, void *p3, void *p4)
これによりctypes
、EHLLAPIライブラリーが提供するすべてのことを実行できる単一の単純な関数になりますが、他のライブラリーでは、ctypes
ライブラリー関数ごとに別個の関数をセットアップする必要がある可能性があります。
からの戻り値WINFUNCTYPE
は関数プロトタイプですが、(型に加えて)追加のパラメーター情報を設定する必要があります。の各タプルにhllApiParams
は、パラメーター「方向」(1 =入力、2 =出力など)、パラメーター名、およびデフォルト値があります-詳細についてはctypes
docoを参照してください
プロトタイプとパラメーター情報を取得したらhllApi
、関数を呼び出すための「呼び出し可能」なPythonを作成できます。必要な変数を作成し(私の場合はp1
スルーp4
)、それらを使用して関数を呼び出すだけです。
hllApiParams
ますか?それらのタプルのポイントは何ですか?この例のいくつかをドキュメントと一致させることは困難です。
このページには、DLLファイルから関数を呼び出す非常に単純な例があります。
完全を期すために、ここで詳細を言い換えます。
PythonでDLL関数を呼び出すのは非常に簡単です。私は2つの機能を備えた自作のDLLファイルを持っています
add
し、sub
二つの引数を取るいます。
add(a, b)
2つの数値の加算を返します2つの数値の
sub(a, b)
減算を返しますDLLファイルの名前は「demo.dll」になります。
プログラム:
from ctypes import*
# give location of dll
mydll = cdll.LoadLibrary("C:\\demo.dll")
result1= mydll.add(10,1)
result2= mydll.sub(10,1)
print "Addition value:"+result1
print "Substraction:"+result2
出力:
Addition value:11
Substraction:9
ctypesを使用してDLLにアクセスできます。チュートリアルは次のとおりです。
私は建物どのように完全に働いた例を提示shared library
し、下にそれを使用してPython
によるctypes
。Windows
事情を考慮して対処しDLLs
ます。2つのステップが必要です。
shared library
私が考えるには、以下の通りであるとに含まれるtestDLL.cpp
ファイル。唯一の関数testDLL
は、int
を受け取って出力するだけです。
#include <stdio.h>
extern "C" {
__declspec(dllexport)
void testDLL(const int i) {
printf("%d\n", i);
}
} // extern "C"
コマンドラインからDLL
with をビルドするにはVisual Studio
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\vsdevcmd"
インクルードパスを設定して実行するには
cl.exe /D_USRDLL /D_WINDLL testDLL.cpp /MT /link /DLL /OUT:testDLL.dll
DLLをビルドします。
DLL
IDEからまたは、次のようにしてDLL
ビルドできVisual Studio
ます。
Pythonでは、次のようにします。
import os
import sys
from ctypes import *
lib = cdll.LoadLibrary('testDLL.dll')
lib.testDLL(3)
ctypesが最も簡単に使用できますが、(誤用)を使用すると、Pythonがクラッシュしやすくなります。あなたが何かを素早くやろうとしていて、あなたが注意しているなら、それは素晴らしいことです。
Boost Pythonをチェックすることをお勧めします。はい、それはあなたがいくつかのC ++コードを書いてC ++コンパイラを持っていることを必要とします、しかしそれを実際に使うためにC ++を学ぶ必要はありません、そしてあなたはMicrosoftから無料の(ビールのように)C ++コンパイラを得ることができます。
DLLのタイプがCOMライブラリの場合は、pythonnetを使用できます。
pip install pythonnet
次に、Pythonコードで、次のことを試してください
import clr
clr.AddReference('path_to_your_dll')
次に、DLLのクラスに従ってオブジェクトをインスタンス化し、その中のメソッドにアクセスします。