在非线性优化和最优控制方面,python有个著名的第三方库CasADi,其非线性规划求解函数nlpsol可以调用已经编译好的.dll文件,以便加快运算速度:
import casadi as ca
dll_path = r'C:\你的\dll文件\路径.dll'
ipopt_options = {
'verbose': False,
"ipopt.tol": 1e-4,
"ipopt.acceptable_tol": 1e-4,
"ipopt.max_iter": 100,
"ipopt.warm_start_init_point": "yes",
"ipopt.print_level": 0,
"print_time": False
}
my_solver = ca.nlpsol("solver", "ipopt", dll_path, ipopt_options)
但很容易出现以下报错信息:
RuntimeError: .../casadi/core/importer_internal.cpp:229: Assertion "handle_!=0" failed:
CommonExternal: Cannot open "C:\你的\dll文件\路径.dll". Error code (WIN32): 193
经过几天排查,发现原因有俩:
- 虽然有时python可以识别包含中文的路径(比如整个project位于带有中文的路径下,只要在代码头部将project路径添加到sys.path中即可),但在调用.dll文件时路径里不能有任何中文。
- 如果不是路径问题,则需要检查你的.dll文件的位数是否与python位数不一致。一个是32位,另一个是64位会导致无法打开文件。在此需要注意,有人可能会想利用Microsoft Visual Studio的dumpbin命令查看.dll的依赖项,但其实就算发现依赖项中有KERNEL32.dll,也不能说明你的.dll文件是32位的。最好的办法是重新编译生成你的.dll文件(前提是有.c源文件),而且编译前选择与python一样的位数,具体编译方法可以看我的另一篇文章
|