我想使用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函数期望的数据类型。我是否缺少有关数据类型的内容?
答案 0 :(得分:0)
我找到了解决自己问题的方法。只需首先使用'String'.encode('utf-8')
对字符串进行编码