小编eri*_*rik的帖子

使用ctypes传递数组

我有一个C函数

void read_FIFO_AI0(int16_t** input, size_t size, NiFpga_Session* session, NiFpga_Status* status)
{
  *input = (int16_t*) malloc (size*sizeof(int16_t));
  // function that populates the array *input
}
Run Code Online (Sandbox Code Playgroud)

填充数组"*input".现在我想将该数组中的数据传递给python进行进一步处理.我尝试使用ctypes来做到这一点:

def read_FIFO_AI0(size,session,status):
    _libfpga.read_FIFO_AI0.argtypes = [POINTER(ARRAY(c_int16, size)), c_int, POINTER(c_uint32), POINTER(c_int32)]
    _libfpga.read_FIFO_AI0.restype = None

    values = (c_int16*size)()
    _libfpga.read_FIFO_AI0(byref(values),size,byref(session),byref(status))
    return values
Run Code Online (Sandbox Code Playgroud)

代码执行但我在数组中得到错误的结果.当我尝试在CI中使用C函数时获得正确的结果:

size_t size=20;
int16_t* input;

read_FIFO_AI0(&input, size, &session, &status);
Run Code Online (Sandbox Code Playgroud)

填充数组的正确方法是什么,以便我可以在Python中访问数据?我没有依赖于使用指向已填充的数组的指针,我也可以在C函数中创建数组并将其作为返回Python发送,但我也没有开始工作.

c python arrays ctypes

6
推荐指数
1
解决办法
8379
查看次数

如何在Python中正确分离数据采集,处理和可视化?

我正在开发一个项目,我希望在Python中执行数据采集,数据处理和GUI可视化(使用pyqt with pyqtgraph).原则上实现了每个部件,但是不同的部件没有很好地分开,这使得难以进行基准测试和改进性能.所以问题是:

有没有一种很好的方法来处理软件不同部分之间的大量数据?

我想到类似以下情况:

  • 获取:从某些设备获取数据并将其存储在可从其他位置访问的某个数据容器中.(这部分应该能够在没有处理和可视化部分的情况下运行.这部分是时间关键的,因为我不想丢失数据点!)
  • 处理:数据容器中获取数据,处理数据,并将结果存储在另一个数据容器中.(此部分应该能够在没有GUI的情况下运行并且在采集后延迟(例如我上周记录的过程数据).)
  • GUI /可视化:容器中获取已获取和已处理的数据并将其可视化.
  • 保存数据:我希望能够将数据的某些部分存储/流式传输到磁盘.

当我说"大量数据"时,我的意思是我得到的数据每秒大约有200万个数据点(16位),需要处理并可能也存储.

是否有任何Python框架可以用来正确处理大量数据?也许是我可以连接到的数据服务器的形式.

python data-acquisition

6
推荐指数
1
解决办法
924
查看次数

创建 HDF5 文件时损坏文件而不关闭它们 (h5py)

我正在使用 h5py 将实验数据存储在 HDF5 容器中。

在交互式会话中,我使用以下命令打开文件:

measurement_data = h5py.File('example.hdf5', 'a')
Run Code Online (Sandbox Code Playgroud)

然后我使用一些自己编写的函数将数据写入文件(可以是几天实验中的许多 GB 数据)。在实验结束时,我通常会使用

measurement_data.close()
Run Code Online (Sandbox Code Playgroud)

不幸的是,有时会发生交互式会话在没有我明确关闭文件的情况下结束(意外终止会话、断电、由于某些其他软件导致操作系统崩溃)。这总是会导致文件损坏和完整数据丢失。当我尝试打开它时,出现错误:

OSError: Unable to open file (File signature not found)
Run Code Online (Sandbox Code Playgroud)

我也无法在 HDFview 或我尝试过的任何其他软件中打开该文件。

  1. 即使文件没有明确关闭,有没有办法避免损坏的文件?我在此处阅读了有关使用 with 语句的信息,但是当会话意外结束时,我不确定这是否会有所帮助。
  2. 我可以以某种方式恢复损坏文件中的数据吗?有维修程序吗?

每次写访问时总是打开和关闭文件对我来说听起来很不利,因为我不断地从许多不同的函数和线程写入数据。所以我会更满意不同的解决方案。

python corruption h5py

6
推荐指数
1
解决办法
5470
查看次数

将大型ndarray快速放入多处理.Queue

当试图把一个大ndarrayQueue放入一个Process,我遇到以下问题:

首先,这是代码:

import numpy
import multiprocessing
from ctypes import c_bool
import time


def run(acquisition_running, data_queue):
    while acquisition_running.value:
        length = 65536
        data = numpy.ndarray(length, dtype='float')

        data_queue.put(data)
        time.sleep(0.1)


if __name__ == '__main__':
    acquisition_running = multiprocessing.Value(c_bool)

    data_queue = multiprocessing.Queue()

    process = multiprocessing.Process(
        target=run, args=(acquisition_running, data_queue))

    acquisition_running.value = True
    process.start()
    time.sleep(1)
    acquisition_running.value = False
    process.join()

    print('Finished')

    number_items = 0

    while not data_queue.empty():
        data_item = data_queue.get()
        number_items += 1

    print(number_items)
Run Code Online (Sandbox Code Playgroud)
  1. 如果我使用length=10左右,一切正常.我通过队列传输了9个项目.

  2. 如果我length=1000在我的计算机上增加process.join()块,虽然功能run() …

python multiprocessing

3
推荐指数
1
解决办法
3304
查看次数

获取包内文件的路径?

我有一个 Python 包,它的组织方式如下:

package
|- subpackage
|  |- code.py
|  |- window.ui
| ...
Run Code Online (Sandbox Code Playgroud)

code.py我要访问的文件window.ui通过

PyQt4.uic.loadUi('window.ui', self)
Run Code Online (Sandbox Code Playgroud)

这个效果很好,如果我只是运行code.pysubpackage作为工作目录。但是,如果我从另一个工作目录导入包,则找不到此文件:

IOError: [Errno 2] No such file or directory: 'window.ui'
Run Code Online (Sandbox Code Playgroud)

我的问题:如何获取文件code.py所在目录的路径名,以便创建window.ui. 或者,我怎样才能最有效地访问文件window.ui.

os.path.abspath('.')这里尝试,但它只返回当前工作目录的绝对路径。

python import module

2
推荐指数
1
解决办法
389
查看次数

将数字拆分为C中的高位和低位

我想使用C API将Labview FPGA中的数据发送到C函数.为了使数据传输同步,我执行以下操作:

1)输入:

  • 3x I16值
  • 1x U16值

2)在两个步骤中,我使用Labview中的连接数函数将这4个值打包到U64中(它确实是hi.lo).所以它基本上是:

((I16.I16).(I16.U16))
(   U32   .   U32   )
         U64
Run Code Online (Sandbox Code Playgroud)

3)现在这个U64值被转移到C函数,它应该被解压缩,如下所示:

         U64
(   U32   .   U32   )
((I16.I16).(I16.U16))
Run Code Online (Sandbox Code Playgroud)

现在我想知道如何在C中处理拆包.在Labview中是否有类似"拆分号"功能的东西?如何确保所有部件都分配了正确的数据类型?

c labview

0
推荐指数
1
解决办法
850
查看次数