gpt4 book ai didi

python - 如何在 Fuse python 中正确编写 readdir?

转载 作者:行者123 更新时间:2023-11-28 22:51:25 25 4
gpt4 key购买 nike

我想学习如何在 Fuse 中编写文件系统。我的想法是编写一个与 pinboard.in(书签服务)通信的文件系统。我对 readdir 有疑问。据我所知(这不是很多,因为这对我来说是新东西)readdir 是返回文件系统中的文件和文件夹的函数。

我有以下代码:

def readdir ( self, path, flags ):
print '*** readdir', path, flags
if path == '/':
# Path is root meaning we need to list tags and untagged bookmarks
tags_json=urllib2.urlopen('https://api.pinboard.in/v1/tags/get?format=json&auth_token='+self.apitoken).read()
tags = json.loads(tags_json)
ret = map(lambda k: fuse.Direntry(name=k, type=stat.S_IFDIR), tags.keys())
print ret
return ret
else:
pass

在带有调试标志的 Fuse 中运行时,我得到类似

的信息
    *** getattr /
unique: 2, success, outsize: 120
unique: 3, opcode: OPENDIR (27), nodeid: 1, insize: 48, pid: 6441
unique: 3, success, outsize: 32
unique: 4, opcode: READDIR (28), nodeid: 1, insize: 80, pid: 6441
readdir[0] from 0
*** readdir / 0
[<fuse.Direntry object at 0xb65b8f70>, <fuse.Direntry object at 0xb65b8f90>,........,<fuse.Direntry > object at 0xb65e1670>]
unique: 4, success, outsize: 16
unique: 5, opcode: RELEASEDIR (29), nodeid: 1, insize: 64, pid: 0
unique: 5, success, outsize: 16

但是文件系统是空的。我尝试了所有的东西,但我认为我不了解文件系统的流程。我真正的问题是,我要返回什么以便 ls 显示文件/目录?我应该在哪里阅读有关此内容的信息?

如果您需要更多代码,可以转到我的 bitbucket 并阅读所有内容:https://bitbucket.org/aquaplanet/pinboard.in-fuse/commits/38212eb035d3aba163bab9ed5a6b9284ce1dc93c

非常感谢您花时间阅读我的问题,我期待着任何答案!

解决方案

感谢@aleatha,他告诉我我写的是正确的,但在 tags.keys() 中有一种类型错误,正常的字符串有效,我很快发现 tags.keys() 是 unicode。尽管在 LANG 和 LC_CTYPE(在树莓派上工作)中都有 sv_SE.UTF-8,但它需要 8 位字符串。这样效果更好:

def readdir ( self, path, flags ):
print '*** readdir', path, flags
if path == '/':
# Path is root meaning we need to list tags and untagged bookmarks
tags_json=urllib2.urlopen('https://api.pinboard.in/v1/tags/get?format=json&auth_token='+self.apitoken).read()
tags = json.loads(tags_json)
ret = map(lambda k: fuse.Direntry(name=k.encode('iso-8859-1','replace'), type=stat.S_IFDIR), tags.keys())
return ret
else:
pass

最佳答案

您看起来走在正确的道路上……您需要返回一系列 Direntry 对象。

如果我用一个简单的字符串数组替换您的 API 调用,如下所示:

tags = ["a", "b", "c"]  
ret = map(lambda k: fuse.Direntry(name = k, type = stat.S_IFDIR), tags)
return ret

然后它工作正常。所以我的猜测是 tags.keys() 有问题。我将从检查各个 Direntry 对象开始,看看它们看起来是否正确。

关于python - 如何在 Fuse python 中正确编写 readdir?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21538311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com