You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用trackpy和pims处理TIFF序列时遇OSError(Errno9)错误求助

问题

使用Python的trackpy和pims库追踪流体粒子位置,处理.tiff序列帧时,执行tp.batch出现OSError: [Errno 9] Bad file descriptor错误,且每次报错的帧不固定。

代码示例

import numpy as np
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy.ndimage.interpolation import zoom
import pandas as pd
import trackpy as tp
import pims
from scipy.optimize import curve_fit

v = pims.ImageSequence('Capture_*.tiff')
v = pims.as_grey(v)

f = tp.locate(v[0], 5, minmass=20, maxsize=3, invert=True)

f = tp.batch(v[:], 5, minmass=20, maxsize=3, invert=True)

报错信息

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
/var/folders/xj/cw6n24v100l7s1rkm85p4qym0000gn/T/ipykernel_3149/1176320070.py in 
----> 1 f=tp.batch(v[:], 5, minmass=20, maxsize=3, invert=True)

~/opt/anaconda3/envs/APL_BM_env2/lib/python3.7/site-packages/trackpy/feature.py in batch(frames, diameter, output, meta, processes, after_locate, **kwargs)
    555     try:
    556         all_features = []
--> 557         for i, features in enumerate(map_func(curried_locate, frames)):
    558             image = frames[i]
    559             if hasattr(image, 'frame_no') and image.frame_no is not None:

~/opt/anaconda3/envs/APL_BM_env2/lib/python3.7/multiprocessing/pool.py in next(self, timeout)
    746         if success:
    747             return value
--> 748         raise value
    749 
    750     __next__ = next                    # XXX

OSError: [Errno 9] Bad file descriptor

解决思路与方案

该错误多由tp.batch默认多进程模式下,pims的ImageSequence对象出现文件句柄共享冲突导致,可尝试以下方案:

  • 强制单进程运行:在tp.batch中指定processes=1,避免多进程间的文件资源竞争:

    f = tp.batch(v[:], 5, minmass=20, maxsize=3, invert=True, processes=1)
    
  • 预先加载所有帧到内存:将所有tiff帧读取到内存列表后再传入tp.batch,绕开多进程重复读取文件的问题:

    frames_list = [frame for frame in v]
    f = tp.batch(frames_list, 5, minmass=20, maxsize=3, invert=True)
    
  • 验证文件完整性:随机抽取报错帧单独读取,确认.tiff文件无损坏:

    # 替换为报错的帧序号
    test_frame = v[10]
    plt.imshow(test_frame)
    plt.show()
    
  • 更新依赖库:旧版本trackpy/pims可能存在多进程兼容bug,更新至最新稳定版:

    pip install --upgrade trackpy pims
    

内容的提问来源于stack exchange,提问作者NikNack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:32:18