免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2843 | 回复: 9
打印 上一主题 下一主题

可能是python(win)的一处Bug吧? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-01 03:24 |只看该作者 |倒序浏览
本帖最后由 kgd7558 于 2010-06-01 03:32 编辑

最近遇到一个问题,追了好久,如果我用法没错的话,可能是python的Bug吧?具体如下:

Python 2.6 final
Release date: 01-Oct-2008

1、封的一个二进制文件读写类,功能比较简单
2、没有涉及到多线程之类,没有互斥影响
3、所有地址相关整型都用long型,(int型也试过,也有问题)
4、在写入的文件大小比较大时,比如5G情况下,第一次可能可以正常写入
5、关键是在覆盖写入时(先seek,再write),seek正常,但write可能无返回
6、Linux下很正常,只是windows下偶尔出现,在NTFS以及FAT32上都会出现。
7、各位有遇到过没?
  1. import os, threading

  2. class FileIO():

  3.     def __init__(self, path):
  4.         self.path = path
  5.         self.fd = None
  6.         self.__lock = threading.RLock()
  7.         if not self.open():
  8.             print('open file(%s) FAILED' % self.path)

  9.     def __del__(self):
  10.         self.close()

  11.     def lock(self):
  12.         self.__lock.acquire()
  13.    
  14.     def unlock(self):
  15.         self.__lock.release()

  16.     def open(self):
  17.         if self.fd:
  18.             return True
  19.         try:
  20.             if os.path.isfile(self.path):
  21.                 self.fd = open(self.path, 'r+b')
  22.             else:
  23.                 self.fd = open(self.path, 'w+b')
  24.             return True
  25.         except:
  26.             print('open device %s FAILED' % self.path)
  27.         return False

  28.     def close(self):
  29.         if self.fd:
  30.             self.fd.close()
  31.             self.fd = None

  32.     def get_size(self):
  33.         try:
  34.             stat = os.stat(self.path)
  35.             return stat.st_size
  36.         except:
  37.             print('get file(%s) status FAILED.' % self.path);
  38.             return 0

  39.     def write(self, offset, buf):
  40.         try:
  41.             self.fd.seek(offset, os.SEEK_SET)
  42.             self.fd.write(buf)
  43.             self.fd.flush()
  44.             return True
  45.         except:
  46.             print('write buffer FAILED(offset=%d, length=%d)' % (offset, len(buf)))
  47.             return False

  48.     def read(self, offset, length):
  49.         try:
  50.             self.fd.seek(offset, os.SEEK_SET)
  51.             buf = self.fd.read(length)
  52.             if len(buf) != length:
  53.                 print('read buffer FAILED(offset=%d, length=%d)' % (offset, length))
  54.                 buf = None
  55.             return buf
  56.         except:
  57.             print('read buffer FAILED(offset=%d, length=%d)' % (offset, length))
  58.             return None
  59.         
  60.     def flush(self):
  61.         try:
  62.             self.fd.flush()
  63.         except:
  64.             print('flush FAILED')
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-06-01 08:51 |只看该作者
本帖最后由 luffy.deng 于 2010-06-01 08:56 编辑

windows  fat32  没有4G文件大小限制?

论坛徽章:
0
3 [报告]
发表于 2010-06-01 09:20 |只看该作者
回复 2# luffy.deng

我测试时,FAT32中,读写不超过4G,在NTFS中,大于4G

论坛徽章:
0
4 [报告]
发表于 2010-06-01 10:21 |只看该作者
fat32是有4g的限制

论坛徽章:
0
5 [报告]
发表于 2010-06-01 10:23 |只看该作者
应该是操作系统底层支持的问题,不是语言本身的问题吧。

论坛徽章:
0
6 [报告]
发表于 2010-06-01 11:26 |只看该作者
不太确定你所说的“ 但write可能无返回” 是什么意思? 是被阻塞在write调用上么?

论坛徽章:
0
7 [报告]
发表于 2010-06-01 12:31 |只看该作者
回复 5# 2gua
我的意思是python执行环境实现代码可能有问题,语言本身应该没什么问题

论坛徽章:
0
8 [报告]
发表于 2010-06-01 12:32 |只看该作者
回复 6# luffy.deng

是阻塞在write调用上

论坛徽章:
0
9 [报告]
发表于 2010-06-01 14:57 |只看该作者
回复  luffy.deng

是阻塞在write调用上
kgd7558 发表于 2010-06-01 12:32


按理说不会。能不能看一下你是怎么调用你自己封的 open   write的?另外是如何判断出来阻塞在write上的?

论坛徽章:
0
10 [报告]
发表于 2010-06-05 01:20 |只看该作者
回复 9# luffy.deng
调用很简单,传一个偏移与一个串下去,
write上下分别l加print进行调试,

1、如果有异常,一定会返回
2、write只打上边print的信息,下边的print信息没打
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP