由 python 加载时无法从 c 模块调用系统(malloc、printf)

问题描述 投票:0回答:1

以下代码有效,但是当我添加注释语句(new int)时,它失败了:

FileNotFoundError:找不到模块“libkv_module_shared.dll”(或其依赖项之一)。尝试使用带有构造函数语法的完整路径。

C++:

int a = 7;
extern "C" {
__declspec(dllexport) size_t setup() {
    //new int; works unless commented in
    return ++a;
}
}

Python

from flask import Flask, jsonify, request
import os
import ctypes

#DLL_REL_PATH = './cmake-build-debug/'
DLL = 'libkv_module_shared.dll'
DLL_FULL_PATH = "C:/Users/editn/CLionProjects/kv_module_shared/cmake-build-debug/"

os.add_dll_directory(DLL_FULL_PATH)
os.environ['PATH'] += DLL_FULL_PATH

clib = ctypes.WinDLL(DLL)
print("Using clib={:}".format(clib))

clib.setup.argtypes = ()
clib.setup.restype = ctypes.c_ssize_t
print(clib.setup())

注意:在窗口、Python 3.1、Win 11 上工作

我尝试了 ctypes.WinDLL 和 CDLL 的其他变体,其中的路径描述和 winmode 参数有所变化,其中大多数在加载时较早失败。

使用 CLion 2024.1,我构建共享库,然后从 CLion 执行 python。作为 Flask 服务器形式 PowerShell 执行时的行为相同(此代码中不存在,因为它被专门剥离到手头的问题)

附加信息:替换为

clib = ctypes.CDLL(DLL)
时 该程序仍然有效,但引入
new int;
它会以不同的方式失败(并且在加载指令之前) FileNotFoundError:找不到模块“libkv_module_shared.dll”(或其依赖项之一)。尝试使用带有构造函数语法的完整路径。

使用 malloc() 代替 new() 是有效的。显然,问题取决于加载时是否发现某些第三层依赖项。

python ctypes dllimport
1个回答
0
投票

我将代码移植到 linux ubuntu 上,一切正常。也许对于后代来说,有人可以解释为什么这在 Windows 上不起作用

© www.soinside.com 2019 - 2024. All rights reserved.