1

我想从 python 访问一个 android 设备来下载一些照片。libmtp 从 CLI 工作。比pymtp。它已经存在了一段时间,但它是为 python 2 设计的,我正在使用 python 3。同时修复了几个小问题,但我遇到了函数 get_filelisting 的错误,特别是本节:

ret = []
next = files
while next:
    ret.append(next.contents)
    if (next(next.contents) is None):
        break
    next = next(next.contents)

该错误与“下一个”有关。

那部分对我来说看起来很奇怪,我已经在 python 中编码了一段时间,但我是 ctypes 的新手。尝试了很多变种,都失败了。“下一个”可能与 python 内置函数混淆,所以我将它重命名为 nextpointer 并来到这段代码:

ret = []
nextpointer = files
while nextpointer:
    ret.append(nextpointer.contents)
    nextpointer = nextpointer.contents.next

它似乎有效,但它是否偶然有效?它有任何设计缺陷吗?任何有 python ctypes 经验的人都可以确认这是一个解决方案吗?欢迎任何建议。

4

1 回答 1

1

来自python2.7文档

下一个(迭代器 [,默认值])

通过调用其 next() 方法从迭代器中检索下一项。如果给出默认值,则在迭代器耗尽时返回,否则引发 StopIteration。

来自 python3 文档

下一个(迭代器 [,默认值])

通过调用其 __next__() 方法从迭代器中检索下一项。如果给出默认值,则在迭代器耗尽时返回,否则引发 StopIteration。

请注意,从 python3 中删除了 next()方法,但该函数仍然存在。

这就是关于下一个函数和 .next()/__next__() 方法的全部内容。

我下载了 pymtp 模块,get_filelisting() 与您在移植代码中发布的内容略有不同,这里是:

ret = []
next = files
while next:
    ret.append(next.contents)
    if (next.contents.next == None):
        break
    next = next.contents.next

如果这些都没有帮助您(可能没有:D),我正在使用的 pymtp 库版本是 0.0.6 使用 pip 下载。

于 2015-12-23T01:03:40.927 回答