使用ctypes在Python中使用hdf5库

时间:2016-08-25 21:01:29

标签: python ctypes hdf5

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

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

到目前为止,我已写过

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文件,创建一个双打数据集,写入数据并关闭文件。

3 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:1)

我还没有(还)完成任何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关于如何调用函数的示例相结合,应该足以让您创建初始文件。

答案 2 :(得分:0)

我遵循了给出的建议,并且我编写了一个小型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