在 Python 中使用 hdf5 库和 ctypes
Use of hdf5 library in Python with ctypes
我想直接从 Python
和 ctypes
使用 hdf5
库。我知道 h5py
和 PyTables
可以完美地完成这项工作。我想这样做的原因:我需要使用 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 文件,创建双精度数据集,写入数据并关闭文件。
您不需要定义 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)
只需为名称传递一个字符串,为其他两个传递整数。
我(还)没有做过任何 Hdf5 编程,但是通过 the documentation,我看到一些事情要告诉你。
您将传递给 H5Fopen 的参数:名称是您要打开的文件名。标志将是 H5F_ACC_RDWR (1) 或 H5F_ACC_RDONLY (0)。这些标志是互斥的;不要或他们在一起。第二个 int 是文件访问属性列表的标识符。对于基本情况,您可以将其设置为 H5P_DEFAULT (0)。
不过,这是文档中的重要内容:
Note that H5Fopen does not create a file if it does not already exist; see 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.[=14= 查找它们]
结合@101 关于如何调用函数的示例,这些信息应该足以让您制作初始文件。
我遵循了给出的建议,并编写了一个小的 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
我想直接从 Python
和 ctypes
使用 hdf5
库。我知道 h5py
和 PyTables
可以完美地完成这项工作。我想这样做的原因:我需要使用 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 文件,创建双精度数据集,写入数据并关闭文件。
您不需要定义 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)
只需为名称传递一个字符串,为其他两个传递整数。
我(还)没有做过任何 Hdf5 编程,但是通过 the documentation,我看到一些事情要告诉你。
您将传递给 H5Fopen 的参数:名称是您要打开的文件名。标志将是 H5F_ACC_RDWR (1) 或 H5F_ACC_RDONLY (0)。这些标志是互斥的;不要或他们在一起。第二个 int 是文件访问属性列表的标识符。对于基本情况,您可以将其设置为 H5P_DEFAULT (0)。
不过,这是文档中的重要内容:
Note that H5Fopen does not create a file if it does not already exist; see 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.[=14= 查找它们]
结合@101 关于如何调用函数的示例,这些信息应该足以让您制作初始文件。
我遵循了给出的建议,并编写了一个小的 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