Python的os.stat返回错误的inode值

4

我正在运行CentOS Linux。

我使用专有文件系统创建了以下目录:

$ mkdir fooDir

首先,我使用 "ls -ldi" 命令来检查 inode 值:
$ ls -ldi
total 4
9223372036854783200 drwxrwxrwx 2 root root 4096 Jan  6 20:58 fooDir

然后,我确认“stat”报告的是相同的inode:

$ stat /fooDir
  File: `/fooDir'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 14h/20d Inode: 9223372036854783200  Links: 2
Access: (0777/drwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-01-06 20:58:13.000000000 +0000
Modify: 2016-01-06 20:58:13.000000000 +0000
Change: 2016-01-06 20:58:23.000000000 +0000

但是当我切换到 Python 的交互式提示符并对目录运行 om.stat 命令时:

$ python
Python 2.6.6 (r266:84292, Jun 18 2012, 14:18:47) 
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.stat("/fooDir")
posix.stat_result(st_mode=16895, st_ino=-9223372036854768416, st_dev=20L, st_nlink=2, st_uid=0, st_gid=0, st_size=4096, st_atime=1452113893, st_mtime=1452113893, st_ctime=1452113903)
>>> 

Python的os.stat返回的inode值与stat命令报告的值不匹配。
文件系统已将inode值9223372036854783200分配给目录“fooDir”,但Python的os.stat返回“-9223372036854768416”。
我可以理解它将其视为有符号值并因此带有负号,但是我困惑于为什么它是完全不同的值。
这里发生了什么?为什么Python的os stat返回错误的inode值?(或者根据“stat”命令是错误的)

你说你正在使用专有文件系统。也许这就是问题所在?那个inode号码看起来非常大。 - John Gordon
这些数字在模2 ** 64下是等价的。 - kalhartt
我可以处理它将其视为有符号值,因此出现了负号。从有符号到无符号的转换不仅仅是添加/删除符号前缀。如果你做正确的转换,这两个数字是相同的。阅读一些这些资源:什么是“二进制补码”?维基百科二进制补码页 - kaylum
这是在Python 2.x中发生的,因为在Python 3.8.6中它可以正常工作。 - somenxavier
2个回答

5
我发现inode号本应为无符号长整型,但om.stat将其解释为负数,是因为最高位被设置了。
现在我知道它应该是无符号的,我可以按照以下方式解决这个问题:
import ctypes
ctypes.c_ulong(os.stat(<dir here>).st_ino).value

一种更简单的解决方案,不需要其他依赖项:
if inode < 0 :
    inode += 1 << 64

-1
使用命令模块,它将返回相同的结果。
   import commands
   commands.getstatusoutput('stat /fooDir')

你可能是对的,但这并没有回答问题,因为在那种情况下,你只是绕过了Python的'os.stat()'命令。 - arainone
谢谢您的回复。是的,那可能是一个好的解决方法。但仍然没有回答问题。 - jersey bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接