0

dll以下のコードサンプルでは、​​ヘルパー関数内でオブジェクトを使用できるようにしたいと思います。

def HelperFunc():
    # How to use dll here?
    pass

def LoadMyDLL():
    dll = ctypes.CDLL( "libmydll.so" )
    dll.HelperFunction = HelperFunction
    return dll

dll = LoadMyDLL()
dll.HelperFunc()

明らかにパラメータとしてに渡すことができますが、この関数をインポートしているので、dllに含まれているように見せかけて、繰り返しHelperFuncて呼び出すのはきれいではありません。dll.HelperFunc(dll)dll

dllオブジェクトをグローバル変数に格納することもできます。次に、dllを2回ロードしないように保護を追加し、1つのdllをロードしたままにする必要があります。

しかし、内部から取得する方法、またはそれを静かに通過させる方法はありdllますHelperFuncか?

4

3 に答える 3

2

グローバルを回避するために、クロージャまたは静的メソッドを持つオブジェクトを使用して、dllを保存して再利用できます。

def LoadMyDLL(dll = ctypes.CDLL( "libmydll.so" )):
    def closure():
        return dll
    return closure

dll = LoadMyDLL()()

ヘルパー関数がdllバインディングを使用する場合も同様です。

def HelperFunc():
    dll = LoadMyDLL()()
    # and use the dll

アップデート

上記の答えは、クロージャのためではなく、グローバル関数LoadMyDLLのデフォルトのキーワード引数dllのために機能しました。

このデフォルトのキーワード引数(dll = ...)は、関数LoadMyDLLがグローバル関数として定義されているときに一度初期化されます。これは非常に簡単な解決策があることを意味します:

def LoadMyDLL(dll = ctypes.CDLL( "libmydll.so" )):
    return dll

dll = LoadMyDLL() # get the dll, which has already been initialized 

とヘルパー関数で:

def HelperFunc():
    dll = LoadMyDLL() # get the dll again
    # and use the same dll
于 2013-01-08T15:56:40.297 に答える
1

したがって、人々が忘れがちな(または決して学習しない)ことの1つは、関数にも属性があり、それらは完全に変更可能であるということです。だからあなたはすることができます:

def LoadMyDLL():
    dll = ctypes.CDLL("libmydll.so")
    dll.HelperFunction = HelperFunction
    dll.HelperFunction.dll = dll
    return dll

しかし、これは問題を引き起こします:dll.HelperFunction.dll is HelperFunction.dll。したがって、最後の呼び出しが何であれ、にアタッチされているオブジェクトにLoadMyDLLなります。のコンテキスト外でHelperFunctionを使用していない場合は、次のことを行うことをお勧めします。の属性を作成せず、必要な場所で呼び出すだけです。Pythonは参照渡しであるため、変更する場合は変更します。私を信じていないのにサンプルコードを投稿してほしい場合は、イラストを使って編集させていただきます。CDLLHelperFunctiondll.HelperFunction()HelperFuncdllHelperFunction(dll)dll

免責事項一般的に、あなたがしているように見えることは、私にはまったく正しく見えません。このようなことをしたい場合は、CDLLオブジェクトをとして格納するクラスを作成し、そのクラスにメソッドをself.dll作成することをお勧めします。次に、そのメソッドからHelperFunctionアクセスできます。self.dllもちろん、デザインはあなたの決定であり、コードの残りの部分を見ることができませんが、後者は私にはもっと自然に思えます(そして私の推測では、他の多くの人にもそうでしょう)。

編集以下の議論のために、私が提案したクラスを構築することをどのように考えるかについてのアイデアを提供したいと思います(上記はそのまま受け入れられましたが)。

class DLLHelper(object):
    def __init__(self, static_object=None, helper_function=None):
        self.dll = ctypes.CDLL(static_object or "libmydll.so")

    def HelperFunction(self):
        # do stuff with self.dll

    def OtherRelatedFunction(self):
        # do stuff with self.dll and self.HelperFunction


dll = DLLHelper()
dll.HelperFunction()
于 2013-01-08T15:28:08.150 に答える
1
def HelperFunc():
    HelperFunc.dll.OtherFunction()

def LoadMyDLL():
    dll = ctypes.CDLL( "libmydll.so" )
    HelperFunction.dll = dll
    dll.HelperFunction = HelperFunc
    return dll

dll = LoadMyDLL()
dll.HelperFunc()

それを行う方法になります。確かにもっと良い方法がありますが...

于 2013-01-08T15:28:13.540 に答える