Python:导入dll时发生访问冲突错误

Python:导入dll时发生访问冲突错误,python,dll,import,ctypes,access-violation,Python,Dll,Import,Ctypes,Access Violation,我有dll与一些硬件通信。我想把它加载到python中。为了包装dll,我编写了一个类来处理它。减少但有效:OOspec.py # file OOSpec.py from ctypes import * import os # types definitions c_double_p = POINTER(c_double) c_OOSpec_p = POINTER(c_ulong) # to ma byt proste pointer.

我有dll与一些硬件通信。我想把它加载到python中。为了包装dll,我编写了一个类来处理它。减少但有效:OOspec.py

# file OOSpec.py

from ctypes import *
import os

# types definitions
c_double_p = POINTER(c_double)
c_OOSpec_p = POINTER(c_ulong) # to ma byt proste pointer. 
                              # Pointer by snad mel mit rozsah unsigned int. 
c_int_p = POINTER(c_int)

class Device(Structure):        
    _fields_ = [("spectro", c_OOSpec_p), 
                ("smoothLen", c_int), 
                ("winStart", c_int), 
                ("winEnd", c_int), 
                ("wvlns", c_double_p), 
                ("Dwvlns", c_double_p), 
                ("spectrum", c_double_p), 
                ("SNspectrum", c_double_p), 
                ("NDspectrum", c_double_p), 
                ("specLen", c_int)]

DEV = POINTER(Device)

class OOSpec:

    def __init__(self):
        # library load
        self.Bandidll = CDLL("BanditTDll.dll")
        # initialisation of return variables
        OOBandit_init = self.Bandidll.OOBand_init
        OOBandit_init.restype = DEV
        # instrument initialization
        self.device = OOBandit_init()

    def closeDevice(self):
        self.Bandidll.OOBand_destroy(self.device)

def whatever():
    A = OOSpec()
    A.closeDevice()

#whatever()
任何用于测试的函数。如果未注释,脚本将无错误地执行

现在,如果我将这个类导入到其他脚本并尝试相同的操作,dll将返回访问冲突写入

下面是尝试加载它的步骤:

from OOSpec.OOSpec import *

device = OOSpec()
执行构造函数会触发错误。我已经检查了DLL内部。除dll希望写入调用期间分配的内存外,所有内容都被正常调用

任何帮助都将不胜感激,我不明白为什么从一个文件调用相同的代码时没有错误,但从另一个文件触发错误。我甚至不知道从哪里寻找问题的根源


Windows7,64位,Python 3.2。DLL是用MSVC++2008 ExpressEddition编写和测试的

我在这里碰碰运气,但这是一个名称空间问题?请尝试在代码上导入OOSpec和device=OOSpec.OOSpec。如果Windows在调用OOBand_init时引发访问冲突,则ctypes有一个异常处理程序将其路由到WindowsError。或者进程会因为Windows异常对话框而崩溃?这与此无关,但我会将加载库和定义函数原型从_init_;中移出。它只需要在模块或类定义中执行一次。您解决问题了吗?对不起,我不记得了。