【发布时间】:2019-05-07 19:31:11
【问题描述】:
我想通过 Python 访问和使用 Netica C API。虽然我可以使用 ctypes windll 加载 Netica.dll 库,但我在使用库函数时遇到了困难,因为(似乎)其中许多函数需要特殊的数据类型用于某些输入和输出。
我将 Netica 与 Python 集成的基点是此处提供的包装器:https://publicwiki.deltares.nl/pages/viewpage.action?pageId=95158343
这个包装器使用 ctypes 加载 Netica.dll 并提供函数来访问 .dll 中的函数。
上面提供的链接是使用包装器的示例。当我运行这个例子时,我得到一个“错误类型”的错误(下面会更好地描述)。为了便于讨论,请考虑以下代码:
from ctypes import *
netica = windll.LoadLibrary('Netica.dll')
# Create Netica Environment
netica.NewNeticaEnviron_ns.argtypes = [c_char_p, c_void_p, c_char_p]
netica.NewNeticaEnviron_ns.restype = c_void_p
env = netica.NewNeticaEnviron_ns(None, None, None) # (const char* license, environ_ns* env, const char* locn)
# Initialize Netica
mesg = create_string_buffer(300)
netica.InitNetica2_bn.argtypes = [c_void_p, c_char_p]
netica.InitNetica2_bn.restype = c_int
netica.InitNetica2_bn(env, mesg) # (environ_ns* env, char* mesg)
# Create New Network
netica.NewNet_bn.argtypes = [c_char_p, c_void_p]
netica.NewNet_bn.restype = c_void_p
net = netica.NewNet_bn('NewNetwork', env) # (const char* name, environ_ns* env)
当我运行上面的代码时,我得到以下错误:
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
这表明 netica.NewNet_bn() 的第一个参数是错误的类型,即使它是一个字符串并且 arg 类型被定义为“c_char_p”。
作为参考,我在 cmets 中添加了 .dll 函数所期望的数据类型。我是否遗漏了有关数据类型的内容?
【问题讨论】: