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()

我显然可以将它作为参数传递给HelperFunc,但是我正在导入这个函数,假装它包含在 dll 中,重复调用是不干净dll.HelperFunc(dll)的。dll

我还可以将dll对象存储到全局变量中。然后我需要添加保护以避免加载 dll 两次,保持加载单个 dll。

但是有没有办法dll从内部获得HelperFunc,或者让它默默地通过?

4

3 回答 3

2

为了避免全局变量,您可以使用闭包或具有静态方法的对象来保存和重用 dll。

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

dll = LoadMyDLL()()

与使用 dll 绑定的 helper func 相同:

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

更新

上面的答案有效,不是因为闭包,而是因为全局函数 LoadMyDLL 中的默认关键字参数 dll。

当函数 LoadMyDLL 被定义为全局函数时,此默认关键字参数 (dll = ...) 被初始化一次。这意味着有一个非常简单的解决方案:

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

所以人们经常忘记(或从不知道)的一件事是函数也具有属性并且它们是完全可变的。所以你可以这样做:

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

但这会产生一个问题:dll.HelperFunction.dll is HelperFunction.dll. 因此,无论您最后一次调用LoadMyDLL是什么,都将CDLL是附加到HelperFunction. 如果您没有在上下文之外使用 HelperFunction,dll.HelperFunction()那么我建议您执行以下操作:不要创建HelperFunc的属性dll,只需HelperFunction(dll)在需要的地方调用。如果你想修改它,dll因为 Python 是通过引用传递的,它会这样做。如果您不相信我并希望我发布示例代码,我很乐意用插图对其进行编辑。

免责声明一般来说,你似乎在做的事情对我来说根本不正确。如果您想做这样的事情,我建议创建一个将CDLL对象存储为的类self.dllHelperFunction在该类上创建一个方法。然后您可以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 回答