【问题标题】:Integrating Netica with Python将 Netica 与 Python 集成
【发布时间】: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 函数所期望的数据类型。我是否遗漏了有关数据类型的内容?

【问题讨论】:

    标签: python ctypes


    【解决方案1】:

    我找到了解决我自己问题的方法。只需要先使用 'String'.encode('utf-8') 对字符串进行编码

    【讨论】:

    • 或者你可以这样做:net = netica.NewNet_bn(b'NewNetwork', env).
    猜你喜欢
    • 2012-05-14
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2011-01-12
    • 2011-01-06
    相关资源
    最近更新 更多