Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中hdf5库与ctypes的结合使用_Python_Ctypes_Hdf5 - Fatal编程技术网

Python中hdf5库与ctypes的结合使用

Python中hdf5库与ctypes的结合使用,python,ctypes,hdf5,Python,Ctypes,Hdf5,我想使用hdf5库直接从Python与ctypes一起使用。我知道h5py和PyTables做得很好。我想这样做的原因是:我需要使用hdf5文件和Python解释器,在那里我无法安装任何软件包 我正在寻找一个例子,创建一个文件,并写一个清单的双重 到目前为止,我已经写了 from ctypes import * hdf5Lib=r'/usr/local/lib/libhdf5.dylib' lib=cdll.LoadLibrary(hdf5Lib) major = c_uint() minor

我想使用
hdf5
库直接从
Python
ctypes
一起使用。我知道
h5py
PyTables
做得很好。我想这样做的原因是:我需要使用
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
...

我不知道怎么打电话给Fopen。我应该使用
H5Fopen.argtypes
?任何建议都可以打开hdf5文件,创建一个双精度数据集,写入数据并关闭文件。

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

herr_t = lib.H5Fopen()
编辑:对于带有参数的版本,请尝试:

lib.H5Fopen.restype = c_int
lib.H5Fopen.argtypes = (c_char_p, c_uint, c_int)
herr_t = lib.H5open(name, flags, fapl_id)
只需为名称传递一个字符串,为其他两个传递int。

我(还)没有做过任何Hdf5编程,但仔细看,我看到一些事情要告诉你

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

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

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

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

对于H5Fcreate,这是签名

hid_t H5Fcreate( const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id )
Name是文件名。fcpl_id和fapl_id都可以是H5P_默认值,即0。在这种情况下,您的标志是H5F_ACC_TRUNC(2)以覆盖现有文件,或H5F_ACC_EXCL(4)以在尝试创建现有文件时导致错误

我假设你有权找到我列出的常量值,但如果你没有,你可以像我一样,在


这些信息,再加上@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;
}

函数
H5Fopen
接受参数:它的原型是
hid\u t H5Fopen(const char*name,unsigned flags,hid\u t fapl\u id)我需要帮助才能使用此函数的三个参数我需要使用带有Python解释器的hdf5文件,在那里我无法安装任何软件包。如果允许在文本编辑器中键入文本并保存它,为什么不能将相关的python代码复制粘贴到工作目录?对我来说,这似乎是一个简单得多的解决方案。
H5F_ACC_TRUNC  = 2
H5P_DEFAULT    = 0
H5T_STD_I32LE  = 50331712
H5T_STD_I32BE  = 50331713
H5T_NATIVE_INT = 50331660
H5S_ALL        = 0