1

私はツイストを使用して sftp サーバーを作成してきましたが、ISFTPServer.openDirectory 関数から情報を返すのに問題があります。

class MySFTPAdapter:
    implements(filetransfer.ISFTPServer)
    def openDirectory(self, path):
        return ('test', 'drwxrwxrwx    1 ab       cd              0 Apr 23 15:41 test', {'size': 0, 'uid': 1000, 'gid': 1000, 'mtime': 1366746069L, 'atime': 1366746069L, 'permissions': 511})

で失敗する

    Traceback (most recent call last):
  File "sftpserver.py", line 435, in dataReceived
    f(data)
  File "/usr/lib/python2.6/dist-packages/twisted/conch/ssh/filetransfer.py", line 265, in packet_OPENDIR
    d.addCallback(self._cbOpenDirectory, requestId)
  File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 260, in addCallback
    callbackKeywords=kw)
  File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 249, in addCallbacks
    self._runCallbacks()
--- <exception caught here> ---
  File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 441, in _runCallbacks
    self.result = callback(self.result, *args, **kw)
  File "/usr/lib/python2.6/dist-packages/twisted/conch/ssh/filetransfer.py", line 269, in _cbOpenDirectory
    handle = str(hash(dirObj))
exceptions.TypeError: unhashable type: 'dict'

例外フレーム ローカルは次のとおりです。

{'val': ('test', 'drwxrwxrwx    1 ab       cd              0 Apr 23 15:41 test', {'size': 0, 'uid': 1000, 'gid': 1000, 'mtime': 1366746069L, 'atime': 1366746069L, 'permissions': 511})}

何が起きているのか、何が間違っているのか誰にも分かりますか?

4

1 に答える 1

3

の実装openDirectory:

def openDirectory(self, path):
    return ('test',
            'drwxrwxrwx    1 ab       cd              0 Apr 23 15:41 test',
            {'size': 0, 'uid': 1000, 'gid': 1000, 'mtime': 1366746069L,
             'atime': 1366746069L, 'permissions': 511})

3 つの要素のタプルを返します。インターフェイスのドキュメントから:

    This method returns an iterable object that has a close() method,                                                                      
    or a Deferred that is called back with same.                                                                                           

    The close() method is called when the client is finished reading                                                                       
    from the directory.  At this point, the iterable will no longer                                                                        
    be used.                                                                                                                               

    The iterable should return triples of the form (filename,                                                                              
    longname, attrs) or Deferreds that return the same.  The                                                                               
    sequence must support __getitem__, but otherwise may be any                                                                            
    'sequence-like' object.                                                      

返されたタプルは、戻り値全体ではなく、ここで説明されている反復子の要素のように聞こえます。

次のようなものを試してください:

def openDirectory(self, path):
    yield ('test',
           'drwxrwxrwx    1 ab       cd              0 Apr 23 15:41 test',
           {'size': 0, 'uid': 1000, 'gid': 1000, 'mtime': 1366746069L,
            'atime': 1366746069L, 'permissions': 511})

これで、close メソッドを持つイテレータであるジェネレータができました。このジェネレータの要素は、ドキュメントで説明されている 3 つのタプルです。

于 2013-04-30T18:58:54.067 に答える