从 Python (ctypes) 到 C 的指针以保存函数输出

2024-04-02

我是 Python 中 C 集成的新手。我目前正在将 .dll 库包装到我的 Python 代码中,使用ctypes我在传递指针来保存特定函数的输出时遇到问题。

我的 C 函数具有以下结构:

function(int* w、int* h、无符号短* data_output)

Where h and w是输入和数据输出是一个大小的数组(宽×高,1).

通过创建一个函数,我能够成功地集成并检索 Matlab 中函数的结果零点(宽 x 高,1)数组并将其作为指针传递libpointer('uint16Ptr', 零(w x h, 1)).

我怎样才能在Python中做到这一点?

对于其他函数,输出为int*类型 我能够使用成功检索值创建字符串缓冲区。但我还没有设法让它为这个工作。

谢谢。


根据[SO]:如何创建一个最小的、完整的和可验证的示例(mcve) https://stackoverflow.com/help/mcve,您的问题不包含基本信息(例如您的尝试)。请务必在接下来的内容中纠正这一点。

Also, [Python.Docs]:ctypes - Python 的外部函数库 https://docs.python.org/library/ctypes.html#module-ctypes.

这是一个说明该概念的虚拟示例。

dll00.c:

#include <stddef.h>

#if defined(_WIN32)
#  define DLL_EXPORT __declspec(dllexport)
#else
#  define DLL_EXPORT
#endif


DLL_EXPORT int function(int w, int h, unsigned short *pData)
{
    if (pData == NULL) {
        return -1;
    }
    int k = 0;
    for (int i = 0; i < h; ++i)
        for (int j = 0; j < w; ++j)
            pData[i * w + j] = ++k;
    return w * h;
}

代码00.py:

#!/usr/bin/env python

import ctypes as cts
import sys


DLL_NAME = "./dll00.{:s}".format("dll" if sys.platform[:3].lower() == "win" else "so")


def print_array(data, h, w):
    for i in range(h):
        for j in range(w):
            print("{:2d}".format(data[i * w + j]), end=" ")
    print()


def main(*argv):
    dll_dll = cts.CDLL(DLL_NAME)
    function = dll_dll.function
    function.argtypes = (cts.c_int, cts.c_int, cts.POINTER(cts.c_ushort))
    function.restype = cts.c_int

    h = 3
    w = 5

    ArrayType = cts.c_ushort * (h * w)  # Dynamically declare the array TYPE: `unsigned short[15]` in our case
    array = ArrayType()  # The array type INSTANCE

    print_array(array, h, w)
    res = function(w, h, cts.cast(array, cts.POINTER(cts.c_ushort)))
    print("{:} returned: {:d}".format(function.__name__, res))

    print_array(array, h, w)


if __name__ == "__main__":
    print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
                                                   64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    rc = main(*sys.argv[1:])
    print("\nDone.\n")
    sys.exit(rc)

Output:

(qaic-env) [cfati@cfati-5510-0:/mnt/e/Work/Dev/StackExchange/StackOverflow/q054753828]> ~/sopr.sh
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###

[064bit prompt]> ls
code00.py  dll00.c
[064bit prompt]> gcc -fPIC -shared -o dll00.so dll00.c
[064bit prompt]> ls
code00.py  dll00.c  dll00.so
[064bit prompt]> 
[064bit prompt]> python ./code00.py 
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] 064bit on linux

 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
function returned: 15
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 

Done.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Python (ctypes) 到 C 的指针以保存函数输出 的相关文章

随机推荐

  • 确定递归函数的复杂性(大 O 表示法)

    我明天有计算机科学期中考试 我需要帮助确定这些递归函数的复杂性 我知道如何解决简单的情况 但我仍在努力学习如何解决这些更困难的情况 这些只是我无法解决的一些示例问题 任何帮助将不胜感激 并对我的学习有很大帮助 谢谢 int recursiv
  • 如何以编程方式询问当前应用程序的 URL 方案?

    我的 iOS 应用程序有 50 多个目标 每个目标都有自己的自定义 URL 方案 我需要检测来自 webview 的请求是否与当前运行的应用程序的方案匹配 为了做到这一点 我需要能够从代码中询问当前应用程序的 URL 方案 类似的问题涉及尝
  • MySQL如何获取特定范围内的平均值

    我有以下表格数据 value 1 5 10 5 12 36 我想将这些值映射到 range avg 0 21 1 5 10 5 12 4 21 001 34 0 34 001 64 36 64 0 基本上将每个值映射到范围并计算每个范围内所
  • Android dagger依赖循环

    我有两个具有相同范围的依赖项 彼此需要 我的依赖项是具有不同方法的域服务 每种方法都有不同的业务案例 某些业务案例可能会使用另一个领域的方法 为此 我需要域 1 可用于域 2 反之亦然 但是当我这样做时 我收到依赖循环编译错误 经过谷歌搜索
  • 指针 - 数组和指针之间的区别

    有什么区别a a和第一个元素的地址a 0 相似地p是一个指向用数组地址分配的整数的指针 会pointer 进行指针算术并根据数据类型获取值 进一步的价值是什么 预计 它应该是一个指针吗 include
  • Maya Python 中的 cmds.scriptCtx 到底有什么作用?

    我想知道 cmds scriptCtx 命令到底是做什么的 因为我尝试将其直接从 Autodesk 帮助页面复制并粘贴到我的脚本编辑器中 但没有任何反应 以下是 Autodesk 帮助中的脚本 import maya cmds as cmd
  • C#:获取 XML 文档的所有节点

    有没有一种简单的方法 从 xml 文档中获取所有节点 我需要每个节点 子节点等来检查它们是否具有某些属性 或者我是否必须爬行文档 询问子节点 在 LINQ to XML 中 这非常简单 XDocument doc XDocument Loa
  • (选择)H2 中的Where()

    我有两种软件 都是Java 一种是MySQL 另一种是H2数据库 我的问题是在 MySQL 中我有这个查询 Select from X where 1 2 3 in select 4 5 6 from Y 但在 H2 中给我这个错误 子查询
  • 教科书上的长除法如何是 O(n^2) 算法?

    Premise This 维基百科页面 http en wikipedia org wiki Computational complexity of mathematical operations建议 的计算复杂度 教科书 长除法 http
  • sprintf 用于无符号 _int64

    我有以下代码 sprintf 中第二个 d 的输出始终显示为零 我认为我指定了错误的说明符 任何人都可以帮助我编写具有正确值的字符串 这必须在 posix 标准中实现 感谢您的投入 void main unsigned int64 dbFi
  • PercentRelativeLayout 性能更高?

    我总是使用 LinearLayout 和relativelayout 并且我正在阅读有关 新 的内容百分比相对布局 http developer android com intl es reference android support p
  • 标签云网络服务?

    是否有可以生成标签云的公共免费网络服务 我正在寻找类似 Google Chart 的东西 URL 输入 图像输出 我非常怀疑 为此提供网络服务没有任何意义 不过 有大量的图书馆 代码点火器 http codeigniter com foru
  • 无法将类型“NHibernate.Hql.Ast.HqlCast”的对象转换为类型“NHibernate.Hql.Ast.HqlBooleanExpression”

    我正在使用以下 C 代码 public IList
  • 如何嵌入LLVM?

    LLVM 核心项目包括 编译器 将源代码转换为 LLVM IR VM 执行编译后的IR代码 如何将 VM 嵌入到 C 应用程序中 LLVM 实际上是一个可以链接到的库的集合 因此嵌入起来非常容易 更多时候 LLVM 会获取您生成的 IR 并
  • 如何在 Eclipse 中下载或链接 OpenCV Javadoc

    我使用 Eclipse IDE 在 Java 中使用 OpenCV 3 0 但我想将 Javadoc 附加到 OpenCV jar 以便轻松阅读有关方法和参数用法的信息 在我使用 OpenCV 2 4 10 之前 它有很好的源代码文档 可以
  • 如何在 IOS 8 Iphone 4S 上使用移动 Safari Web 应用程序获得全屏模式

    我对移动开发非常陌生 所以请不要因为新手问题而困扰我 我认为我有正确的元标记 从苹果网站来看 它说使用下面的标签来允许在全屏模式下运行 但它似乎不起作用 宽度和高度是为 IOS 8 上的 Iphone 4S 设置的 width 320px
  • 添加剪辑路径后子元素消失

    对于我正在做的一个设计项目 我想在我的辅助内容上放置一个剪辑路径 然而 在放置剪辑路径代码后 一些子元素或元素在我的 about内容 我尝试过使用position absolute or z index但我的内容没有任何反应 about内容
  • Python 海龟滚动条

    有谁知道如何防止滚动条出现在 Python 中的小窗口尺寸的 Turtle Graphics 窗口上 以下代码生成下图 对于 600 像素 x 600 像素的屏幕 不会出现滚动条 import turtle TURTLE SIZE 20 T
  • Angular JS 和 Phonegap 后退按钮事件

    我有一个 MainCtrl 其中包含历史记录的后退堆栈 如下所示 scope urlHistory scope on routeChangeSuccess function if location absUrl split 1 scope
  • 从 Python (ctypes) 到 C 的指针以保存函数输出

    我是 Python 中 C 集成的新手 我目前正在将 dll 库包装到我的 Python 代码中 使用ctypes我在传递指针来保存特定函数的输出时遇到问题 我的 C 函数具有以下结构 function int w int h 无符号短 d