将Netica与Python集成

时间:2019-05-07 19:31:11

标签: python ctypes

我想使用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”。

作为参考,我在注释中添加了.dll函数期望的数据类型。我是否缺少有关数据类型的内容?

1 个答案:

答案 0 :(得分:0)

我找到了解决自己问题的方法。只需首先使用'String'.encode('utf-8')

对字符串进行编码