FAT ファイル システムで Python shutil.copy が失敗する (Ubuntu)
質問
問題:Linux で shutil.copy() を使用して FAT16 マウントされたファイルシステムにファイルをコピーすると失敗します (Python 2.7.x)。この失敗は shutil の内部エラーであり、実際には shutil.copy が実行する shutil.chmod で失敗します。
FAT ではアクセス許可がサポートされていないため、シェル chmod も失敗します。
質問:これを回避する良い方法はありますか?たとえば、次のようないくつかのオプションがあることはわかっています。
- copyfile を使用します - ターゲットディレクトリだけでなくフルパスが必要なため理想的ではありませんが、実行可能です
- シェル cp を実行してファイルをコピーする
- ファイルモードを変更しない独自のコピー関数を作成する
Python または FAT マウント オプションでこれを回避する方法はありますか?ここで、 mount -t vfat -o umask=000 /dev/loop0 /mnt/foo を実行して、プログラム内にファイルシステムをマウントします。
例外はshutil.copy内で発生し、shutil.chmod()からIOExceptionをキャッチすると、呼び出し元の関数にIOExceptionを渡す前に、shutil.copy()がターゲットファイルを削除するようであるため、例外をキャッチしても役に立ちません。
何かアイデアはありますか、それとも 1 ~ 3 から 1 つを選択する必要がありますか?
ハンヌ
解決
この場合は騙します。
chmod
が故障したファイルシステムであることがわかっている場合は、chmod
を使用してOSパッケージからdel os.chmod
メソッドを削除するだけで、コピーが成功することができます。
>>> import os
>>> print hasattr(os, 'chmod')
True
>>> foo = os.chmod
>>> del os.chmod
>>> print hasattr(os, 'chmod')
False
.
Chmodで失敗せずにコピーを実行することができます。次に、属性を返すことで再度有効にします。
>>> setattr(os, 'chmod', foo)
>>> print hasattr(os, 'chmod')
True
. 他のヒント
使用 shutil.copyfile
, 、フルパスは必要ありません。
削除中 os.chmod
世界的には ない 良いアイデアです。
$ mkdir folder
$ touch folder/a
$ python2.7 -c 'import shutil; shutil.copyfile("folder/a","folder/b")'
$ ls -rthla folder/
total 0
drwxr-xr-x+ Apr 17 12:49 ../
-rw-r--r-- Apr 17 12:49 a
-rw-r--r-- Apr 17 12:50 b
drwxr-xr-x+ Apr 17 12:50 ./
shutil の Python ソース コードからわかるように (/usr/lib/python2.7/shutil.py
)、パスの考慮事項 (相対/絶対) はありません。 copy
ソースコード、 src
変数は引数として直接渡されます copyfile
.
def copy(src, dst):
"""Copy data and mode bits ("cp src dst").
The destination may be a directory.
"""
if os.path.isdir(dst):
dst = os.path.join(dst, os.path.basename(src))
copyfile(src, dst)
copymode(src, dst)