6

問題: Linux で shutil.copy() を使用してファイルを FAT16 マウント ファイルシステムにコピーすると失敗します (Python 2.7.x)。失敗は shutil 内部エラーであり、実際には shutil.chmod で失敗し、shutil.copy が実行されているようです。

FAT ではパーミッションがサポートされていないため、シェル chmod も失敗します。

質問: これをうまく回避する方法はありますか? たとえば、次のようないくつかのオプションがあることを知っています。

  1. copyfile を使用 - ターゲット ディレクトリだけでなく実行可能なフル パスが必要なため、理想的ではありません
  2. シェル cp を実行してファイルをコピーする
  3. ファイルモードを変更しようとしない独自のコピー関数を作成する

Python または FAT マウント オプションでこれを回避する方法はありますか? mount -t vfat -o umask=000 /dev/loop0 /mnt/foo を実行して、プログラム内にファイルシステムをマウントします。

shutil.copy 内で例外が発生し、shutil.copy() が shutil.chmod() から IOException をキャッチすると、呼び出し元の関数に IOException を渡す前にターゲット ファイルを削除するように見えるため、例外をキャッチしても役に立ちません。

アイデアはありますか、それとも 1 ~ 3 から 1 つを選択する必要がありますか?

ハンヌ

4

2 に答える 2

0

を使用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はパスの考慮 (相対/絶対) はなくcopysrc変数は の引数として直接渡されます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)
于 2015-04-17T10:58:36.307 に答える