【问题标题】:Use of hdf5 library in Python with ctypes在 Python 中通过 ctypes 使用 hdf5 库
【发布时间】:2017-01-02 10:33:09
【问题描述】:

我想直接从Pythonctypes 一起使用hdf5 库。我知道h5pyPyTables 可以完美地完成这项工作。我想这样做的原因是:我需要使用 Python 解释器处理 hdf5 文件,而我无法安装任何软件包。

我正在寻找一个创建文件并编写双打列表的示例。

到目前为止,我已经写了

from ctypes import *
hdf5Lib=r'/usr/local/lib/libhdf5.dylib'
lib=cdll.LoadLibrary(hdf5Lib)
major = c_uint()
minor = c_uint()
release = c_uint()
lib.H5get_libversion(byref(major), byref(minor), byref(release))
H5Fopen=lib.H5Fopen
...

我不知道如何调用 H5Fopen。我应该使用H5Fopen.argtypes 吗?欢迎任何建议是打开 hdf5 文件,创建双精度数据集,写入数据并关闭文件。

【问题讨论】:

  • '我需要使用无法安装任何包的 Python 解释器处理 hdf5 文件。'我从来没有完全理解这些场景。如果允许您在文本编辑器中输入文本并保存,为什么不能将相关的 python 鸡蛋复制粘贴到您的工作目录?对我来说似乎是一个更简单的解决方案。

标签: python ctypes hdf5


【解决方案1】:

您不需要定义 argtypes,因为 H5Fopen 似乎不接受参数。像普通函数一样调用:

herr_t = lib.H5Fopen()

编辑: 带有 args 的版本尝试:

lib.H5Fopen.restype = c_int
lib.H5Fopen.argtypes = (c_char_p, c_uint, c_int)
herr_t = lib.H5open(name, flags, fapl_id)

只需为名称传递一个字符串,为其他两个传递一个整数。

【讨论】:

  • 函数H5Fopen接受参数:它的原型是hid_t H5Fopen( const char *name, unsigned flags, hid_t fapl_id );我需要帮助才能使用这个函数的三个参数!
【解决方案2】:

我(还)没有做过任何 Hdf5 编程,但是通过 the documentation,我看到了一些要告诉你的事情。

您将传递给 H5Fopen 的参数:名称是您要打开的文件名。标志将是 H5F_ACC_RDWR (1) 或 H5F_ACC_RDONLY (0)。这些标志是互斥的;不要或他们在一起。第二个 int 是文件访问属性列表的标识符。对于基本情况,您可以将其设置为 H5P_DEFAULT (0)。

不过,这是文档中的重要内容:

请注意,如果文件不存在,H5Fopen 不会创建文件;请参阅 H5Fcreate。

根据您的描述,您不想使用 H5Fopen。您想使用 H5Fcreate。

对于 H5Fcreate,这是签名

hid_t H5Fcreate( const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id )

名称是文件名。 fcpl_id 和 fapl_id 都可以是 H5P_DEFAULT,即 0。在这种情况下,您的标志是 H5F_ACC_TRUNC (2) 以覆盖现有文件或 H5F_ACC_EXCL (4) 在您尝试创建现有文件时导致错误。

我假设您可以找到我列出的常量值,但如果您不知道,您可以像我一样在http://stainless-steel.github.io/hdf5/hdf5_sys/constant.H5F_ACC_EXCL.html 查找它们。

这些信息,结合@101 的如何调用函数的示例,应该足以让您制作初始文件。

【讨论】:

    【解决方案3】:

    我遵循了给出的建议,并编写了一个小 C 程序来发现不同宏的价值。

    #include "hdf5.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
        printf("H5F_ACC_TRUNC  = %u\n",H5F_ACC_TRUNC);
        printf("H5P_DEFAULT    = %u\n",H5P_DEFAULT);
        printf("H5T_STD_I32LE  = %u\n",H5T_STD_I32LE);
        printf("H5T_STD_I32BE  = %i\n",H5T_STD_I32BE);
        printf("H5T_NATIVE_INT = %u\n",H5T_NATIVE_INT);
        printf("H5S_ALL        = %u\n",H5S_ALL);
        return 0;
    }
    

    生产的

    H5F_ACC_TRUNC  = 2
    H5P_DEFAULT    = 0
    H5T_STD_I32LE  = 50331712
    H5T_STD_I32BE  = 50331713
    H5T_NATIVE_INT = 50331660
    H5S_ALL        = 0
    

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2012-05-06
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多