Python スクレーパー/スパイダーで作業していて、IOError というタイトルの文字制限を超える URL に遭遇しました。httplib2 を使用して URL を取得しようとすると、ファイル名が長すぎるというエラーが表示されます。私は Dropbox を使用しているので、すべてのプロジェクトをホーム ディレクトリ内に置くことを好みます。とにかく、この問題について、または家の外で作業ディレクトリをセットアップする必要がありますか?
3 に答える
ファイル名に最大 143 文字を許可する暗号化ファイル システムの制限に達している可能性があります。
バグは次のとおりです: https://bugs.launchpad.net/ecryptfs/+bug/344878
現時点での解決策は、暗号化されたホーム ディレクトリ以外のディレクトリを使用することです。これを再確認するには:
mount | grep ecryptfs
ホームディレクトリがリストされているかどうかを確認します。その場合は、ホームの上の他のディレクトリを使用するか、暗号化を使用せずに新しいホーム ディレクトリを作成します。
どうやらコンストラクターに渡し'.cache'
たように、httplib.Http
これをより適切なものに変更するか、キャッシュを無効にする必要があります。
で始まるファイル名が長すぎるという事実が'.cache/www.example.com'
問題を説明しています。
httplib2
オプションで、作成したリクエストをキャッシュします。キャッシュを有効に.cache
し、それをキャッシュ ディレクトリとして指定しました。
簡単な解決策は、キャッシュ ディレクトリを別の場所に置くことです。
コードを見なければ、それを修正する方法を教えることは不可能です。しかし、それは些細なことであるべきです。のドキュメントは、最初のパラメーターとしてFileCache
a を取ることを示しています。dir_name
または、代わりにsafe
、URI からファイル名を生成できる関数を渡して、デフォルトをオーバーライドすることもできます。これにより、Ubuntu で暗号化された fs の 144 文字の制限内に収まるファイル名を生成できます。
または、代わりに、と同じインターフェースで独自のオブジェクトを作成し、それFileCache
をオブジェクトに渡してHttp
キャッシュとして使用することもできます。たとえば、 を使用tempfile
してランダムなファイル名を作成し、URL からファイル名へのマッピングをanydbm
またはsqlite3
データベースに保存できます。
もちろん、最終的な代替手段は、キャッシュをオフにすることです。