繁体   English   中英

Python模块代码说路径不存在,但可读且可设定

[英]Python module code says path doesn't exist but is readable and statable

我在python模块中遇到了一个非常奇怪的问题,我不确定这是否是由于python怪异或Windows中的某些损坏或文件系统处于怪异状态引起的。

这是问题所在:我正在使用的模块会创建一些输入到指定目录的输出,如果该目录不存在,则会创建该目录。 如果您运行一次,然后再次运行它,则模块认为该目录不存在,尝试创建该目录,然后以“当该文件已存在时无法创建文件”的错误炸弹,这将很好地工作。

所以,我去挖了。 在我的主脚本中,我可以在目录上运行os.path.exists,它说它存在就可以了。 在模块中,相同的确切代码返回false。 同样在模块中,如果我执行os.access( path ,os.R_OK),则返回true,表示该路径可读;如果执行os.stat( path ),则返回文件信息,表明该路径存在。

如果我在python shell中手动运行相同的代码,则一切正常,表示路径存在,等等。

这是一些代码和输出:

在我的主脚本中:

print('Path {} exists: {} - readable: {} - stat: {}', 
    filename, 
    os.path.exists(filename), 
    os.access(filename, os.R_OK), 
    os.stat(filename))

输出:

File testoutput exists: True - readable: True - stat: nt.stat_result(st_mode=16895, st_ino=0L, st_dev=0L, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1508458382L, st_mtime=1508458382L, st_ctime=1508458382L)

在模块内部,相同的代码:

File testoutput exists: False - readable: True - stat: nt.stat_result(st_mode=16895, st_ino=0L, st_dev=0L, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1508458382L, st_mtime=1508458382L, st_ctime=1508458382L)

这里到底发生了什么? 模块代码是否在具有不同权限的某种不同上下文中运行? 我的文件系统是否以某种奇怪的方式损坏了?

另外,我应该提到所有这些都是在高架cmd外壳中完成的,所以这不是问题。


解决了:

原来,这是一些猴子补丁os.path.exists的中间代码,最有用的工具是使用反射和“检查”模块来找出代码的实际来源,特别是:

    print('os.path: {} - {} - {} - {}'.format(os.__file__, os.path.__name__, os.path.__file__, os.path.exists.__module__))
    print(inspect.getsource(os.path.exists))

__module__信息告诉我monkeypatching在哪里发生。

这只是有根据的猜测。 对于断开的符号链接, os.path.exists将返回False ,而os.access将报告文件本身(符号链接)为可读。 您的文件是否可能是符号链接?

另一个区别是os.access将使用实际的(无效的)uid / gid来测试可读性,而os.path.exists使用的是有效的uid / gid。 模块之间的用户ID是否可能更改?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM