我最近在NFS上遇到了写入文件的IOError。没有磁盘空间或权限问题,所以我认为这只是一个网络打嗝。显而易见的解决方案是将write包装在try-except中,但我很好奇Python中的print和write的实现是否会使得以下任何一个或多或少引发IOError:
f_print = open('print.txt', 'w')
print >>f_print, 'test_print'
f_print.close()
VS
f_write = open('write.txt', 'w')
f_write.write('test_write\n')
f_write.close()
(如果重要,特别是在Linux上的Python 2.4中)。
答案 0 :(得分:1)
打印是根据写入实现的,最终会导致对内核的write(2)调用。你可以在这两个样本上运行strace
并且(在浏览了很多条件之后)看到相同的结果调用write(2)。
实际上,我只是这样做并且省略了2000多行输出:
execve("/usr/bin/python", ["python", "a.py"], [/* 43 vars */]) = 0
open("print.txt", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
write(3, "test_print\n", 11) = 11
close(3) = 0
和
execve("/usr/bin/python", ["python", "b.py"], [/* 43 vars */]) = 0
open("write.txt", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
write(3, "test_write\n", 11) = 11
close(3) = 0
在那里看不到很多差异。无论目标文件是本地磁盘还是NFS挂载,write()调用都是相同的。经常命名的梦魇文件系统 - 所有其他条件相同 - 比本地磁盘更频繁地失败。