Skip to main content
 首页 » 编程设计

python之打印与写入期间 IOError 的可能性

2025年05月04日7开发

我最近遇到了在 NFS 上写入文件的 IOError。没有磁盘空间或权限问题,所以我认为这只是网络问题。显而易见的解决方案是将 write 包装在 try-except 中,但我很好奇 Python 中 print 和 write 的实现是否会或多或少地引发 IOError:

f_print = open('print.txt', 'w') 
print >>f_print, 'test_print' 
f_print.close() 

对比

f_write = open('write.txt', 'w') 
f_write.write('test_write\n') 
f_write.close() 

(如果重要,特别是在 Linux 上的 Python 2.4 中)。

请您参考如下方法:

打印是根据写入实现的,最终导致对内核的 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() 调用都是相同的。在所有其他条件相同的情况下,经常被命名为 Nightmare 的文件系统将比您的本地磁盘更频繁地发生故障。