9

Paramikoを使用して SFTP 経由でファイルをアップロードしていますsftp.put(localFile, remoteFile)。必要に応じて、最初に必要なディレクトリを作成します

    makeCommand = 'mkdir -p "' + remotePath + '"'
    ssh.exec_command(makeCommand)

これは時々機能しますが、時々次のエラーが発生します:

    sftp.put(localFile, remoteFile)
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 565, in put
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 245, in open
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 635, in _request
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 682, in _read_response
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 708, in _convert_status
    IOError: [Errno 2] No such file 

ローカルファイルが確実に存在し(そしてlocalFileそれへの正しいパスである)、リモートパスが作成されているにもかかわらず。同様の問題についてここここで議論がありますが、そこで提起されたポイントはどれも私を助けませんでした。私のサーバーはdf -hiコマンドをサポートしています。これまたは可能な解決策についてアドバイスはありますか?

編集

以下の提案の後、作業ディレクトリを変更しようとしましsftp.chdir(remoteDirectory)たが、この呼び出しで上記とまったく同じエラーが発生しました。したがって、これはアップロードの問題だけではないようです。何か案は?

4

5 に答える 5

10

リモート フォルダのアクセス許可の問題のようです。ファイルがアップロードされる前にリモート フォルダーが作成されましたが、フォルダーのアクセス許可がアップロードを妨げていたようです。

この問題はこの問題に関連しています。アップロードする前に、アップロード先のフォルダーに開く権限を設定すると、プログラムは正常にアップロードできます。パーミッションの問題については取得する必要がありますがIOError: [Errno 13] Permission denied、変更を行ったため、エラーは発生していません。

サーバーが Paramiko に与える応答が問題なのか、それとも Paramiko 自体のバグがIOError: [Errno 2] No such fileの代わりに原因なのかはわかりませんErrno 13が、これで問題は解決したようです。

于 2013-03-22T14:18:46.340 に答える
2

ディレクトリが作成され、それがリモート作業ディレクトリであることを確認しますか?Paramikoには、新しいディレクトリを作成し、リモートファイルシステムをナビゲートするための独自のメソッドがあります。次のようなものの使用を検討してください。

sftp.mkdir(remotedirectory)
sftp.chdir(remotedirectory)
sftp.put(localfile, remotefile)
于 2013-03-20T13:07:05.223 に答える
2

IOErrorローカルであるため、(何らかの理由で)ローカルのPythonがを見つけることができないようlocalFileです。電話をかける前にこれを安全にチェックすると、問題の追跡に役立つ場合があります。

if os.path.isfile(localFile):
    sftp.put(localFile, remoteFile)
else:
    raise IOError('Could not find localFile %s !!' % localFile)

あなたがそれlocalFileが存在することを確信しているなら、これは単にパスの問題である可能性があります-localFile絶対パスまたは相対パスにありますか?いずれにせよ、if上記のステートメントはそれをキャッチします。

編集

paramikoファイルをトレースすると、sftp_client.py(例外をスローしている)の245行目が実際に

fr = self.file(remotepath, 'wb')

paramikoがIOErrorリモートファイルに対してをスローするため、これは非常に誤解を招く恐れがあります。私の最善の推測はremoteFile、ディレクトリが見つからないか、アクセスできないディレクトリのいずれかであるということです。

興味深いことに、リモートディレクトリを一覧表示できますか

sftp.listdir(path=os.path.dirname(remoteFile))

それがそこにあることを確認するために(または多分それがそこにあり、あなたがそれに書くことができる)?

于 2013-03-18T17:12:11.333 に答える