【问题标题】:IOError: no such file when file existsIOError:文件存在时没有这样的文件
【发布时间】:2013-05-24 11:09:27
【问题描述】:

每次更改 less 文件时,我都编写了简单的脚本来更新我的 CSS 样式(从 less 到 css)。我现在有:

import time
import hashlib
from subprocess import call


def md5_checksum(filePath):
    fh = open(filePath, 'rb')
    m = hashlib.md5()
    m.update(fh.read())
    fh.close()
    return m.hexdigest()

md5 = md5_checksum('styles.less')

while True:
    newmd5 = md5_checksum('styles.less')
    if md5 != newmd5:
        sh = open('styles.css', 'w')
        call(['lessc', 'styles.less'], stdout=sh)
        md5 = newmd5
        sh.close()
        print 'Changed'
    time.sleep(0.2)

奇怪的是,脚本运行了一段时间:

Changed
Changed
Changed
Changed
Traceback (most recent call last):
  File "watcher.py", line 16, in <module>
    newmd5 = md5_checksum('styles.less')
  File "watcher.py", line 7, in md5_checksum
    fh = open(filePath, 'rb')
IOError: [Errno 2] No such file or directory: 'styles.less'

怎么了?文件仍然存在 100%。我做错了什么?

【问题讨论】:

  • 文件被我的另一个进程替换了吗?然后您可以轻松捕捉到旧条目被删除而新文件尚不可用的时刻!
  • 您是在 Windows 下运行吗?许多防病毒工具与文件系统操作的交互很糟糕。 :-(
  • jszakmeister:Linux。 Martijn:文件由我在 vim 中编辑。我认为你是对的 ;) 可能当我在 vim 中按 :w 时,vim 需要一些时间来替换该文件。这说得通。谢谢:)
  • 但是……它是怎么做的?每个文件都有一个创建时间。那么当文件被替换时,创建时间也应该被替换?如果文件被替换,为什么创建时间没有改变?如果文件没有被替换,为什么我不能打开阅读?

标签: python file-io ioerror


【解决方案1】:

正如 Martijn Pieters 所指出的,当我在文本编辑器中编辑较少的文件时,有时文件不存在(在保存期间,当旧文件被新文件替换时)。

来自 strace 的日志(strace -o strace.log vim styles.less):

rename("styles.less", "styles.less~")   = 0                               = 0
open("styles.less", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
write(3, "@text-color: #000;\n@btn-font-col"..., 1135) = 1135
fsync(3)                                = 0
getxattr("styles.less~", "security.selinux", "unconfined_u:object_r:user_home_t:s0", 255) = 37
getxattr("styles.less", "security.selinux", "unconfined_u:object_r:user_home_t:s0", 255) = 37
stat("styles.less", {st_mode=S_IFREG|0644, st_size=1135, ...}) = 0
stat("styles.less", {st_mode=S_IFREG|0644, st_size=1135, ...}) = 0
close(3)                                = 0
chmod("styles.less", 0100644)           = 0
setxattr("styles.less", "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0
stat(".../styles.less", {st_mode=S_IFREG|0644, st_size=1135, ...}) = 0
unlink("styles.less~")

因此,可能的解决方案是添加:

try:
    ...
catch IOError:
    continue
else:
    ...

或者,更好的是使用指向那里的方法:How do I watch a file for changes?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多